咋这么难写啊(
先不管本质不同,考虑如何计算区间内平方串个数。
枚举一个 run r=(l,r,p),枚举 len=2kp,其中 k∈N+,那么容易发现该区间内长度为 len 的平方串出现的位置是一条斜率为 1 的线段 (l,l+len−1)→(r−len+1,r)。
接下来考虑本质不同的条件,注意到本质相同的平方串长度一定相等(废话),故可以考虑将一个平方串的等价类中所有出现位置按顺序列出,设相邻两个为 [l0,r0],[l1,r1],则考虑在 (l0,r1) 处作一个 −1 的贡献。
根据我们小学就学过的植树问题,容易发现这样每种等价类只会留下一次贡献。
考虑同一个 run 内的平方串,其删去的贡献显然仍构成一条线段。
然后在不同的 run 之间用哈希表维护出现位置即可。
考虑复杂度。同 run 内枚举的长度个数不会超过 σ(n),故这部分贡献的线段的个数是 O(n) 的。
而一个 run 内本质不同的平方串的个数不超过本原平方串的个数,也即 O(nlogn)。
总共即 O(nlog2n)。
感觉写得好丑……不过能过就不管了(
代码:
1 |
|