解决的问题 KMP算法用于单个字符串匹配,AC自动机用于文章中匹配多个候选词. 流程 第一步,先将候选词先建立前缀树. 第二步,以宽度优先遍历的方式把前缀树的每个节点设置fail指针, 头节点的fail指针指向空, 头节点孩子的fail指针指向头, 其他节点的fail指针设置逻辑为:来到X节点的时候,是设置X的孩子的fail指针. case 1: 假设X通过b指向了它的孩子,假设孩子为C,X的fail指针指向的节点假设为Y,Y有走向b的路,且Y走向b的路是指向的Z,那么 C的fail指针指向Z,…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2846 题目大意:有多个文本,多个模式串.问每个模式串中,有多少个文本?(匹配可重复) 解题思路: 传统AC自动机是计算单个文本中,模式串出现次数. 这里比较特殊,每个文本需要单独计算,而且每个匹配在每个文本中只能计数1次. 比如add,d只能计数1次,而不是:两次. 所以循环逐个对文本Find.每个Find里,进行Hash,保证每个匹配串只计数1次. 由于匹配串可重复,在Insert之前,也需要离散…
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others) Problem Description In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey also wants to bring this feature…
刷的第二题AC自动机,这题简直了.. 用询问的串建AC自动机,然后...爆搜! ACBB                  ACBBACCA                  A  AABBC        ——〉     A  CACBA                  ACBA 像这样,将最外面的每一个点将有可能的方向走,比如第一行第一列的A向东南走,就可以得到一个ACBA的串,然后像模板题一样,去匹配找就行了.(老实讲我还是觉得这个很不靠谱..谁叫人家地图小..) 小细节,我将查询的字符…
si+sj中间有一个切割点,我们在t上枚举这个切割点i,即以t[i]作为最后一个字符时求有多少si可以匹配,以t[i+1]作为第一个字符时有多少sj可以匹配 那么对s串正着建一个ac自动机,反着建一个自动机,然后t正反各匹配一次,用sum[]数组记录t[i]作为最后一个字符可以匹配的串数量 注意:求sum数组时,暴力跳fail显然会t,考虑到跳fail是为了统计匹配串的后缀,那么我们在build时,就可以在处理fail指针时就可以把那个fail的end加到now的end上去,这样就避免了暴力跳f…
/** 题目:hdu3065 病毒侵袭持续中 链接:http://acm.hdu.edu.cn/showproblem.php?pid=3065 题意:N(N <= 1000)个长度不大于50的模式串(保证所有的模式串都不相同), 一个长度不大于2000000的待匹配串,求模式串在待匹配串中的出现次数. 思路:ac自动机做发,val标记每一个病毒串编号,通过print函数统计每一个病毒出现的次数. AC自动机好文章:http://www.cppblog.com/menjitianya/archi…
/** 题目:hdu2896 病毒侵袭 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2896 题意:N(N <= 500)个长度不大于200的模式串(保证所有的模式串都不相同), M(M <= 1000)个长度不大于10000的待匹配串,问待匹配串中有哪几个模式串, 题目保证每个待匹配串中最多有三个模式串. 思路:ac自动机做法,字符为可见字符,那么直接就是他们的ascii值作为每一个字符的标志.最多128: 由于不超过三个,所以找到3个就可以re…
AC自动机板子,学习之前要是忘记了就看一下 1465: [AC自动机]地图匹配 poj1204 时间限制: 1 Sec  内存限制: 256 MB提交: 78  解决: 46[提交] [状态] [讨论版] [命题人:admin] 题目描述 [题意] 给出有一个L*C的字符地图,地图的行与列都从0开始编号然后给出一些字符串,求出这些字符串在字符地图上第一次出现的坐标输出字符串第一个字母的坐标和字符串的方向字符串的方向是指字符串的走向A表示正北,B表示东北,C表示正东,D表示东南,E表示正南,F表示…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 思路分析:该问题为多模式匹配问题,使用AC自动机解决:需要注意的问题是如何统计该待查询的字符串包含的关键字: 假设待查找的字符串为str[0..n],则str[i…j]可能为某一个关键字:假设当前正在匹配字符str[k],则以str[i..k]为关键字的所有可能 可能的关键字的最后一个字符为str[k],使用fail指针进行跳转并判断以str[k]结尾的该结点是否为关键字最后一个结点,重复进行…
摘要: 本文主要讲述了AC自动机的基本思想和实现原理,如何构造AC自动机,着重讲解AC自动机在算法竞赛中的一些典型应用. 什么是AC自动机? 如何构造一个AC自动机? AC自动机在算法竞赛中的典型应用有哪些? 例题解析 什么是AC自动机? 什么是AC自动机,不是自动AC的机器(想的美),而是一种多模匹配算法,英文名称Aho-Corasick automaton(前面的一串据说是一位科学家的名字),于1975年诞生于贝尔实验室. 回忆之前的KMP算法解决的一类问题是给出一个模板和一个文本串,问这一…