咸鱼:你听过AC自动机吗?
不想吃WA的咸鱼:AC自动机,什么魔鬼?一脸茫然.jpg
咸鱼:AC自动机你不知道吗,就是一个算法模板,把这个模板提交到VJ上的任何题目都能自动AC。
不想吃WA的咸鱼:哇!好厉害,赶紧来学一手,这样我就能A掉VJ上的所有题还不吃WA。
在模式匹配问题中,如果模式串有多个,KMP算法就不合适了,因为每次要匹配一个模式串,就要遍历一遍文本串。我们想到KMP算法的状态转移图是利用前缀函数加失配的边匹配上的,如果我们把多个模式串也仿造KMP算法,构建为一个状态转移图不就行了吗,这就是著名的AC自动机了。那为了把所有的的模式串都存在一个状态图里,这时候字典树就排上用场了。注意到KMP的状态转移图是线性的字符串加上失配边组成的,可以猜到AC自动机是Trie加上失配的边组成的。
下图就是字符串{"SHE","HIS","HERS","FG"}所对应的Aho-Corasick自动机
从上图我们不难看出其实AC自动机还是在找自己的真后缀与其他模式串的前缀的过程,比如已经匹配上了字符串“SHE”,那么“HE”肯定也是能匹配上的,所以有一条91指向76的边而且为绿色,代表成功构建了失配指针。通俗一点来讲是这样的比如文本串T=“SHERS”,那么最先匹配上的依次是S,H,E,但是下一个R就匹配不上了,