AC自动机基础应用

前言

本篇博客既不含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个模式串,问是否存在一个无限长的串,其中不含模式串。

标记一下不能到的点,找是否有环即可。

猜你喜欢

转载自blog.csdn.net/myjs999/article/details/81395630