AC自动机讲解
今天花了半天肝下AC自动机,总算啃下一块硬骨头,熬夜把博客赶出来。。
正如许多博客所说,AC自动机看似很难很妙,而事实上不难,但的确很妙。笼统地说,AC自动机=Trie+KMP,但是仅仅知道这个并没有什么用,该写不出来的还是写不出来,必须理解每一步的精确含义。KMP算法的精髓是“用自己匹配自己”,即:如果前i个字符失配时应该转移到第j个字符,那么前i+1个字符失配时应该比较i+1与j+1处的字符。AC自动机是一样的道理,只不过将图画在一颗Trie上,看起来不像KMP那样直观。用语言去描述构造失配边时的过程是这样的:设当前结点和字符分别为u和c,父亲结点的失配边指向v,如果v下有对应c的边,那么说明u的失配边应该指向ch[v][c](因为恰好匹配,公共前缀不变);否则将u视为v的子结点(也可以理解为给v建一个虚拟子结点对应c,然后递归求解虚拟结点的失配边),去找v的失配边指向的结点,直到找到或者v为根结点。
下面用一个例子解释一下这个过程:

现在为Trie加入失配边(这张图有点乱,建议一个点一个点地捋,找到规律就好办了)

朴素的AC自动机就长这样了(红色的边代表失配边)。每次匹配字符串时,如果失配,就沿着失配边一直走直到匹配;如果匹配就对当前结点追溯其失配边,找到所有在自动机中的当前匹配到的字符串的后缀(因为它们本不会被计入答案)。
对于上面的例子,匹配时访问的结点顺序为:1,7,8,23,24,18,19,15,22,3。由于与KMP算法一样,至多回溯O(m)次,因此保证了复杂度是线性的O(n+m)。
事实上,AC自动机有一些优化的方法:
1.既然每次匹配时我要沿失配边找sum不为0的结点(即存在自动机中的完整字符串,而不是字符串的前缀),那么我为什么不直接开一个数组去存这些失配边指向的第一个sum不为0的结点呢?这样明显剩下一些时间。尽管理论上成立,但是我不建议使用这个优化,因为它不仅使AC自动机的代码变得冗长,还不一定有成效(毕竟只是常数优化)。
2.按我上面的介绍,失配与匹配是两种不同的状态,有不同的应对方法,但实际上两者差距并不大,仔细想想我上文的解释:将u视为v的子结点,进行递归求解,也就是说,失配其实就是匹配到了失配边所连接的结点的子结点。两者密不可分,甚至可以通过一些技巧将两者用同样的方法进行处理——只要将建立失配边的过程中,u的c子结点不存在时,ch[u][c]赋值为ch[fail[u]][c]即可。然后匹配时就不需要考虑失配的情况了,统一按匹配的情况进行转移,写起来方便多了。
这道题就是一道AC自动机模板题,除了注意初始化外没有坑,适合上手。
其他题目以后更新。(其实是因为我才学,也只做了一道题)
UPD(2017.12.24):
例题二:UVaLive 4670 Dominating Patterns(鉴于UVaLive的网站很多人上不去,包括我,我就传vjudge的链接了)P.S.这道题在洛谷上有原题,数据可能加强了一点,这里放出传送门。
这题也算是模板题,注意一下模板串可以重复,推荐用map存重复的字符串的编号。还有就是数据范围,哪个是n,哪个是模板串长度要分清(我一开始就在这里RE一次)。
AC自动机讲解的更多相关文章
- AC自动机讲解+[HDU2222]:Keywords Search(AC自动机)
首先,有这样一道题: 给你一个单词W和一个文章T,问W在T中出现了几次(原题见POJ3461). OK,so easy~ HASH or KMP 轻松解决. 那么还有一道例题: 给定n个长度不超过50 ...
- AC自动机讲解超详细
begin:2019/5/2 感谢大家支持! AC自动机详细讲解 AC自动机真是个好东西!之前学KMP被Next指针搞晕了,所以咕了许久都不敢开AC自动机,近期学完之后,发现AC自动机并不是很难,特别 ...
- [BZOJ4327]:[JZOI2012]玄武密码(AC自动机)
题目传送门 题目描述: 在美丽的玄武湖畔,鸡鸣寺边,鸡笼山前,有一块富饶而秀美的土地,人们唤作进香河.相传一日,一缕紫气从天而至,只一瞬间便消失在了进香河中.老人们说,这是玄武神灵将天书藏匿在此. ...
- [BZOJ3940]:[Usaco2015 Feb]Censoring(AC自动机)
题目传送门 题目描述: FJ把杂志上所有的文章摘抄了下来并把它变成了一个长度不超过105的字符串S.他有一个包含n个单词的列表,列表里的n个单词记为t1…tN.他希望从S中删除这些单词.FJ每次在S中 ...
- [BZOJ1030]:[JSOI2007]文本生成器(AC自动机+DP)
题目传送门 题目描述 JSOI交给队员ZYX一个任务,编制一个称之为“文本生成器”的电脑软件:该软件的使用者是一些低幼人群, 他们现在使用的是GW文本生成器v6版.该软件可以随机生成一些文章―――总是 ...
- [BZOJ1195]:[HNOI2006]最短母串(AC自动机+BFS)
题目传送门 题目描述 给定n个字符串(S1,S2,…,Sn),要求找到一个最短的字符串T,使得这n个字符串(S1,S2,…,Sn)都是T的子串. 输入格式 第一行是一个正整数n,表示给定的字符串的个数 ...
- 算法总结篇---AC自动机
目录 写在前面 算法流程 引例: 概述: Trie树的构建(第一步) 失配指针(第二步) 构建失配指针 字典树和字典图 多模式匹配 例题 写在前面 鸣谢: OiWiki 「笔记」AC 自动机---Lu ...
- AC自动机基础知识讲解
AC自动机 转载自:小白 还可参考:飘过的小牛 1.KMP算法: a. 传统字符串的匹配和KMP: 对于字符串S = ”abcabcabdabba”,T = ”abcabd”,如果用T去匹配S下划线部 ...
- 一个在开源中国博客上讲解的AC自动机
原文出处:http://my.oschina.net/amince/blog/196426 原 荐 AC(Aho—Corasiek) 多模式匹配算法 摘要 如何在一篇文章中,搜索多个关键字,如何快速查 ...
随机推荐
- 《从Paxos到Zookeeper:分布式一致性原理与实践》【PDF】下载
内容简介 Paxos到Zookeeper分布式一致性原理与实践从分布式一致性的理论出发,向读者简要介绍几种典型的分布式一致性协议,以及解决分布式一致性问题的思路,其中重点讲解了Paxos和ZAB协议. ...
- Platt SMO 和遗传算法优化 SVM
机器学习算法实践:Platt SMO 和遗传算法优化 SVM 之前实现了简单的SMO算法来优化SVM的对偶问题,其中在选取α的时候使用的是两重循环通过完全随机的方式选取,具体的实现参考<机器学习 ...
- vue vuex vue-rouert后台项目——权限路由(超详细简单版)
项目地址:vue-simple-template共三个角色:adan barbara carrie 密码全是:123456 adan 拥有 最高权限A 他可以看到 red , yellow 和 blu ...
- JS画几何图形之二【圆】
半径为r的圆上的点p(x,y)与圆心O(x0,y0)的关系: x = x0+rcosA; y = y0+rsinA ,A为弧度 样例:http://www.zhaojz.com.cn/demo/dr ...
- 搭建eclipse+tomcat开发环境
JDK 1.6 Eclipse IDE For JEE Version Tomcat 6.0 tomcatPluginV33 //eclipse平台上的插件,但它并不是tomcat本身,需要安装独立 ...
- LODOP打印控件示例
一.lodop打印预览效果图 LODOP.PRINT_SETUP();打印维护效果图 LODOP.PREVIEW();打印预览图 二.写在前面 最近项目用到了LODOP的套打,主要用到两个地方,一是物 ...
- 我是如何确认线上CLOSE_WAIT产生的原因及如何解决的。
1.阐述 内部架构:Tomcat应用程序---> nginx ---> 其他Tomcat应用程序,内部Tomcat应用通过nginx调用其他应用. HTTP插件:HttpClient 4. ...
- C#生成缩略图 (通用模式)
用数据库保存图片的路径和文件名称,把文件保存在文件夹中.//保存在数据库中的文件路径ArrayList arrFilePath=new ArrayList();arrFilePath=myCommon ...
- Generation Axe 吉他之夜音乐会-广州站 感受
本人第一次看音乐会,演唱会跟音乐会是有区别的哈,演唱会以表演.舞蹈.歌唱为主,还有很多特别嘉宾 演出时间: 从20点开始一直到23点多才结束,有五个吉他手,开场跟结束五个吉他手一齐演出.平均每个人表演 ...
- 搜索引擎之全文搜索算法功能实现(基于Lucene)
之前做去转盘网的时候,我已经公开了非全文搜索的代码,需要的朋友希望能够前去阅读我的博客.本文主要讨论如何进行全文搜索,由于本人花了很长时间设计了新作:观点,观点对全文搜索的要求还是很高的,所以我又花了 ...