给你一个串$S$以及一个字符串数组$T[1..m]$,$q$次询问,每次问$S$的子串$S[p_l..p_r]$在$T[l..r]$中的哪个串里的出现次数最多,并输出出现次数。
考虑求查询子串$[q_l,q_r]$在$T_i$出现的次数。和求最长公共子串一样,匹配不了往上跳$link$。对于找到的往上倍增跳$link$,使得公共长度维持在$\geq pr-pl+1$。(尽可能让$endpos$大),然后求当前$endpos$里出现次数。
多个子串可以建立广义后缀自动机,对于每个串建立最后权值线段树,维护$endpos$里出现次数最多的$i$,线段树合并。
- 预处理$S[1..i]$,最多匹配的长度和位置。
- 由于$maxlen[link[]]$满足单调性,可以倍增一下。
复杂度$O(|S|+Q\times (\log|T|+\log m)$
代码
1 |
|