AC自动机入门
AC自动机入门 我学的时候看的是 yyb的博客 链接一个 神奇的东西 讲之前的bb PS :不要想着马上能理解AC自动机, 那是不可能的 。 建议先大致理解一下,然后敲几次板子,这样虽然自己心里不爽,但是在敲板子的过程中就会慢慢理解了 一.算法基础 1.KMP字符串匹配 2.trie树 要求入门并能有一定技巧地运用 二.由来 (匹配泛指各种字符串之间相互包含,交集等问题) 我们学习了KMP,是用来 2 个字符串匹配的算法:O(m+n) 现在给出很多个字符串,去把他们和另外一个字符串匹配,如果逐个匹配,显然会很慢,所以引入一种新算法:AC自动机 这个是分割线吧? 正式开始: 主要思想 Q:多个字符串? A:我们学了trie树是吧,预备一下,把要被匹配的字符串全丢进去 Q:字符串匹配? A:我们学了KMP对吧,想一下KMP的原理,突然发现next[]是不是很吊,预处理出来。 肯定有用,但是肯定预处理方法不同(见后) Q:这个我也想得到啊! A:所以肯定是一个KMP结合trie树的算法,它就叫AC自动机 实现 注意 :以 luogu AC自动机模板 为例 首先一个图,自己画下来再根据代码模拟手玩更容易理解 来自yyb: Insert 一 . 先把所有的匹配字符串丢进trie树,这个不用多说 ljl[].son[] 表示now的每一个儿子(26个字母) 板子 ljl[].end