前言
本篇博客既不含AC自动机定义和构建,也不含border理论。
与后缀自动机类似,AC自动机也是自动机+XX树来完成各种操作的。但AC自动机是为多主串而生的,相比之下,后缀自动机做多主串问题就麻烦得多。
AC自动机上的一个节点对应一个某串的前缀,因此AC自动机的大小是串长×字符集的。
fail树
在fail树上,一个节点的子树内的节点是以这个节点为后缀的所有前缀。
即,一个节点到根的路径是所有前缀中这个节点的所有后缀。
……
好!AC自动机的所有性质已经讲完了。下面我们来看一些应用。
查匹配次数
在自动机上走,每次在后面增加一个字符后,新的要贡献的子串是当前串的所有后缀,即当前节点到根节点的路径。因此链修改+单点查询,或单点修改+子树查询即可。
练习题
阿狸的打字机 Noi2011
题面见各大OJ。
对所有串建立AC自动机。考虑枚举y串的每一位查询x串出现了多少次,但这样时间复杂度过高,考虑统计x串结束点的子树内y串的答案。
于是用树状数组,扫一遍y串,在化实为虚树上记录y串出现位置=1,统计询问x串结束节点子树和即可。
数数 Sdoi2014
给定m个模式串,求1~n中十进制下不包含模式串的数的个数。
f[i][j][0/1][0/1]表示数位第i位,AC自动机上在节点j,是否顶上界,是否有前导零的答案。直接转移即可。
病毒 Poi2000
给定n个模式串,问是否存在一个无限长的串,其中不含模式串。
标记一下不能到的点,找是否有环即可。
魔法咒语 BJOI2017
给定 n n n个模式串, m m m个禁忌串,求有多少种模式串的拼接方案数满足拼接成的串的长度为 L L L且没有一个字串是禁忌串。
建出转移图,用矩阵快速幂优化。