对 S 建 SAM,对 1≤i≤|S|,在 Parent Tree 上倍增求出 li=max{j∣|endpos(Sj…i)|=1}。
对于 1≤i≤|S|,若其存在,考虑其贡献。
显然对于 [li,i] 内的位置,都会造成 i−li+1 的贡献。将 i−li+1 从大到小排序,使用线段树或珂朵莉树实现区间覆盖即可;
而对于 j∈[1,li),会造成 i−j+1 的贡献。这部分的贡献将 li 排序并使用双指针计算答案即可。
代码:
1 |
|
对 S 建 SAM,对 1≤i≤|S|,在 Parent Tree 上倍增求出 li=max{j∣|endpos(Sj…i)|=1}。
对于 1≤i≤|S|,若其存在,考虑其贡献。
显然对于 [li,i] 内的位置,都会造成 i−li+1 的贡献。将 i−li+1 从大到小排序,使用线段树或珂朵莉树实现区间覆盖即可;
而对于 j∈[1,li),会造成 i−j+1 的贡献。这部分的贡献将 li 排序并使用双指针计算答案即可。
代码:
1 | #include <cstdio> |
Related Issues not found
Please contact @Alpha1022 to initialize the comment