小清新根号分治(
注意到 ∑|w|=kq≤105,考虑设一个阈值 S(以下视 n,m,kq 同阶)。
若 k≤S,则暴力枚举 w 串的每个子串,在 SAM 上求出出现次数,然后算出这个子串在 [a,b] 内的贡献,复杂度 O(qk2)=O(nS)。
若 k>S,则对 w 串的每个前缀在 SAM 上匹配,然后枚举 [a,b] 内的一个区间,在 Parent Tree 上倍增找其在 SAM 上的对应状态。复杂度 O(qk+qmlogn)=O(n2Slogn)。
显然当 S 取 O(√nlogn) 时两部分复杂度均衡为 O(n√nlogn)。
代码:
1 |
|