首页 > 代码库 > AC自动机- 自我总结

AC自动机- 自我总结

 

AC自动机算法总结

 No.1 What‘s Aho-Corasick automaton?

  一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。

  简单的说,KMP用来匹配一个模式串;但如果现在有多个模式串需要在同一篇文章中出现,现在就需要Aho-Corasick automaton算法了。

  不要天真的以为AC自动机为auto-Accept,虽然他能让你AC一些题。

 

No.2 My Understanding About Aho-Corasick automaton.

  我的理解:Aho-Corasick automaton = Trie +  KMP

  在KMP算法中,匹配单个字符的时候,我们只需要按照文本线性的扫一遍,然后中途失配的时候,next数组会引导k回溯到正确的位置进行下一步的匹配。

  但是多个模式串的时候要怎么匹配呢?Trie树不就是一个多模式的匹配吗,如果我们将KMP和Trie数结合起来,是不是会有意想不到的效果呢?

  有了这些思考,AC自动机算法就这样产生了。

  在AC自动机中,我们首先将每一个模式串插入到单词书中去,也就是建立一棵Trie树,然后就是构建fail指针,fail指针,顾名思义,就是当匹配失败的时候,用来引导k回溯的一个插穿在Trie树的各个节点之间的一些指针,这个就和KMP算法中的next数组是一样一样的。

  关于fail指针的构建,我也是看李翔大神的PPt才看懂的。

  ppt下载链接:http://wenku.baidu.com/view/93af2c936bec0975f465e2f1.html

  构建完fail指针后,我们就用文章来对这棵Trie树进行匹配了。

  匹配过程分两种情况:(1)当前字符匹配,表示从当前节点沿着树边有一条路径可以到达目标字符,此时只需沿该路径走向下一个节点继续匹配即可,目标字符串指针移向下个字符继续匹配;(2)当前字  符不匹配,则去当前节点失败指针所指向的字符继续匹配,匹配过程随着指针指向root结束。重复这2个过程中的任意一个,直到模式串走到结尾为止。

   对照上图,看一下模式匹配这个详细的流程,其中模式串为yasherhs。对于i=0,1。Trie中没有对应的路径,故不做任何操作;i=2,3,4时,指针p走到左下节点e。因为节点e的count信息为1,所以  cnt+1,并且讲节点e的count值设置为-1,表示改单词已经出现过了,防止重复计数,最后temp指向e节点的失败指针所指向的节点继续查找,以此类推,最后temp指向root,退出while循环,这个过  程中count增加了2。表示找到了2个单词she和he。当i=5时,程序进入第5行,p指向其失败指针的节点,也就是右边那个e节点,随后在第6行指向r节点,r节点的count值为1,从而count+1,循环  直到temp指向root为止。最后i=6,7时,找不到任何匹配,匹配过程结束。

  这个过程和KMP算法的匹配也是非常相似,当然这一步就非常灵活了,我们需要通过多做题来提高熟练度。

 

No.3 Some Good Selection Of Standard Exercises

 1、Hdu 2222

2、Hdu 3695 Computer Virus on Planet Pandora

3、Poj 4052 Hrinity (金华邀请赛I)

4、Zoj 3430 Detect the Virus

5、Spoj 7758. Growing Strings

6、Hdu 4417 GRE Words

8、Hnu 10104 病毒

10、Hnu 11187 Emoticons :-)

11、Zoj 3545 Rescue the Rabbit

12、Hdu 3341 Lost‘s revenge

13、Zoj 3535 Gao the String II

15、Hdu 3962 Microgene

16、大视野 2434 阿狸的打字机 

17、Hdu 3247 Resource Archiver

18、Zoj 3494 BCD Code

 

三. 综合问题

HDU 3247. Resource Archiver

Tags: TSP

HDU 3341. Lost‘s revenge

Tags: 状态压缩、可变进制编码

HOJ 2951. Writing Robot / HDU 3505

Tags: 最大权闭合子图

ZeroJudge b179. 空罐 Cans

Tags: 自动机 DP、fail 指针转移

CodeChef July Challenge 2012. Favourite Numbers

Tags: 二分答案、数位 DP、构造方案

Andrew Stankevich‘s Contest #2, Problem A, Non Absorbing DFA

预处理、DP、高精度

SPOJ. 9941. GRE Words / HDU 4117

  

 

AC自动机- 自我总结