AC自动机

AC自动机

0x00 简介

  • 自动AC机(划去
  • AC自动机和SAM一样是一种有限状态自动机
  • 能够接受一堆字符串的前缀
  • 相当于是许多串上的KMP
  • 可以处理多串匹配的问题
  • 复杂度是线性的(乘上字符集大小)
  • 由于多串转移的特殊性可以做一些DP问题

0x01 实现

  • 简而言之,就是在一个trie上的KMP
  • 维护一个fail指针,相当于KMP中的next数组
  • 先对一些串建trie,然后对trie进行BFS
  • 假设我们正在处理p这个节点
  • 遍历p的所有可能的转移c[w],如果某种转移合法
  • 我们考虑fail指针构成的链,从p开始的链上如果有一个点q有c[w]这个转移,那么c[w]->fail=q->c[w]
  • 正确性很显然
  • 也很好写
  • 在建fail指针过程中可以对转移进行压缩,把一条fail链压缩成一条边,注意要特判NULL的情况,具体实现看代码

0x02 dp

  • 可以做一些什么不出现一些串的长度为l的串里有多少个啊什么的问题
  • 由于压缩后的AC自动机构成的转移是一张图,甚至还可以做邻接矩阵的乘法,搞矩乘加速
许愿弥生改二
原文地址:https://www.cnblogs.com/LoveYayoi/p/6745487.html