先对原串翻转,建出 SAM,设前缀
i 在 SAM 的位置是
posi,要求的就是
i=l∑rmin(i−l+1,deplca(posi,posr))。
对后缀树重链剖分,把每个
i 和询问的
r 插到
posx 祖先的
O(logn) 个重链中,对每个重链分别求答案,再减去来自同一轻子树的询问的前缀即可,那么现在就转成序列问题了。
为了方便,下设
depi 为
posi 在当前重链对应点的 dep。显然只需统计
deplca≤i−l+1 的所有
deplca 之和与对应
i 之和,稍微讨论一下偏序关系容易得到询问
[l,r] 的贡献:
-
depi≤depr∧l≤i−depi+1≤i≤r。
-
depi>depr∧l+depr−1≤i≤r。
第二个限制是好求的,但第一个限制是三维的限制,直接做需要两个
log,比较劣。
观察到
[i−depi+1,i] 的区间长度刚好是
depi,此时不妨讨论一下与
[l,r] 长度与
depr 的关系:
-
若
r−depr+1<l,此时
depi>depr 的
i 必定不会满足第一个限制,所以只用统计满足
l≤i−depi+1≤i≤r 的
i 即可。
-
若
r−depr+1≥l,此时
depi≤depx 中不合法的
i 只需满足
i−depi+1<l,因为若
i>r 那么区间长度要大于
r−l+1,就比
depr 大了。
此时通过讨论即可成功把限制降为二维的,bit 统计即可。
复杂度
O(nlog2n)。