码迷,mamicode.com
首页 > 其他好文 > 详细

浩爷AC自动机快速学习方案

时间:2015-08-17 01:06:34      阅读:167      评论:0      收藏:0      [点我收藏+]

标签:

    今天弄完自动机之后,从那天比赛的阴影中爬出来了,猛地一看真不咋滴难,仔细一看这尼玛还不如猛的一看。。。

 

    必备算法:KMP,字典树(KMP我写了,字典树太简单,就是一个思想,我可以一个图教你做人)

 

    先讲一下字典树:看图

技术分享

    好了,字典树就看酱紫一个图,你要是脑残就装不懂吧!!

 

   下面是AC自动机的正题:

    正如KMP中的求next函数是同样的一个原理

    节点的属性:二十六个字母的指针,fail指针,其他。。。

    重点:fail指针,我把它叫做同级指针,我来教你怎么理解,KMP中求出来的next函数的值表示的是当前字符之前的最长相同前后缀,你可以想想,一个字符串,前缀是不包括最后一个字符的,后缀是不包括第一个字符的,而后缀都匹配成功了,前缀难道会不成功?所以根据next值跳转的位置之前的字符串一定是出现过的,如果有多个,则会从长到短一次相连,你自己写一个就会发现的,而我把next就叫做同级指针,当前位置匹配成功,同级指针指向的位置也一定是成功了的。

    AC自动机算法就是在你构建的字典树上面加操作求同级指针fail。

    求同级指针:

    1.初始化:NULL

    2.根节点下面第一层节点指向根节点(你第一个都匹配失败了,你还想匹配别的?)

    3.其他节点的同级指针的求法:找到当前节点上一层节点同级指针中最近的那一个(同级节点会很多,想next函数一样,直接指向长的串的,短的一次由长的指着),要求那个同级指针的下一层也有当前字符存在,这时就把当前节点的fail只想上一层最近的匹配成功的同级节点下面的那个节点。。。。如果一直没有匹配成功,最后会跳到root,然后跳到NULL,这是直接只想root就是了。。

    下面又是一张屌丝的犀利自拍图:

技术分享

    AC自动机真的不难,对比一下KMP,你会发现在理解上面已经熟练了,剩下的就是组织代码了,刚AC的HDU--2222是个不错的例题,反正网上代码也多,参考一下,然后组织自己的编码风格,这个算法你就过关了,后面的就靠你去举一反三了。。亲,祝你好运。

 

 

版权声明:本文为博主原创文章,未经博主允许不得转载。

浩爷AC自动机快速学习方案

标签:

原文地址:http://blog.csdn.net/jingdianitnan/article/details/47709253

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!