$AC$ 自动机 + 树上小技巧.
对所有的 $s$ 串建出 $AC$ 自动机以及 $fail$ 树.
$fail$ 树中的每个点都能表示一个串,并且在子树 $i$ 内的点,每个点表示的串都有节点 $i$ 对应的串作为后缀.
每次插入一个串 $p$ 时,就在 $AC$ 自动机上匹配它,匹配过程中经过的所有点都是 $p$ 的前缀,而子串可以看做是前缀的后缀,所以将经过的这些前缀都加上一种新颜色,询问时答案就是 $s_i$ 对应节点子树中所含颜色种类.
可以用 $dfs$ 序 + 树状数组进行维护,为了避免一种颜色贡献被算多次,每次染色时将所有需要染色的点按 $dfs$ 序排序,相邻的两个点权值 $+1$ ,它们的 $LCA$ 权值 $-1$ ,询问时直接询问子树内权值总和.
这样做是和构造虚树时的做法差不多的,正确性比较显然.
1 |
|