首先讲题解做法,也是我第一个想到的做法。
对 m1…N 建 AC 自动机,将询问串放在其上匹配,最后走到的状态和其 Fail 树上的全部祖先便是对这个询问串有贡献的。
然后还有一个树上路径的限制,考虑在 Fail 树上用主席树按照树剖的 DFS 序维护每个状态到根路径上的贡献。
然后讲一个假在线做法。
注意到询问串并没有加密,考虑对询问串建广义 SAM,把 m1…N 放在其上匹配,最后走到的状态和其 Parent Tree 上的子树内的状态便是每个模式串贡献到的询问串。
同样建到根路径上的主席树,但是要对询问串的每一个前缀统计贡献。
然后讲一个小常数简单做法,也就是我写的做法。
考虑枚举询问串中匹配的起始位置,枚举匹配长度,在原树上建可持久化 Trie 维护每个结点到根路径上的字符串,通过差分得到一段树上路径的 Trie,如此匹配。
前两个做法都是 O(∑|w|log2n) 的,最后一个是 O(max|mi|∑|w|) 的。
代码:
1 |
|