G. Indie Album
题意
有 $n$ 个字符串,对于第 $i$ 个字符串通过以下两种方式中的一个给出。
- $1 c$,该字符串只含一个字符 $c$ 。
- $2 x c$ ,该字符串为第 $x(1\le x<i)$ 个字符串末尾添加一个字符 $c$ 得到。
有 $m$ 次询问,每次询问给出一个字符串 $s$ 和位置编号 $x$,问在上述第 $x$ 个字符串中,字符串 $s$ 出现了几次。
题解
对询问构建 $AC$自动机,因为文本串是树形结构,我们可以跑一个 $dfs$ 枚举所有文本串,每次都添加一个字符,当回溯回去的时候删除这个字符对答案的贡献。
因为每个匹配串在文本串中出现的次数为将文本串在 $AC$自动机上跑一遍并将走到的位置权值 $+1$,该字符串所对应的 $fail$ 节点的子树权值和。所以我们拎出 $fail$ 树,对其 $dfs$ 序构造树状数组。
代码
1 |
|