不会kmp和Trie树的请点击右上角X。

AC自动机与kmp的唯一区别便是从单模式串变成了多模式串。

那么与kmp相同,AC自动机中的fail指针是指向当前状态的最长后缀。

当然这个后缀要在Trie树中存在,且不能指向自己。当然在Trie树中不存在它的后缀时,fail指针指向根。

于是在用文本串匹配时,只要在走到每个状态时沿着此状态对应文本串当前字符的字符边向下走即可。

在文本串的某个字符失配时,需要移动到其fail指针指向的状态并继续尝试匹配此字符。

/*
这是一道模板题的核心代码
给出一个文本串和一个字典,输出在文本串中出现了字典中的多少个单词
*/ void insert(){
int cur=0,len=strlen(str);
for(int i=0;i<len;i++){
if(ch[cur][str[i]-'a']==0)
ch[cur][str[i]-'a']=++size;
cur=ch[cur][str[i]-'a'];
}
tag[cur]++; return ;
}
/*
将字符串插入Trie树并记录tag
*/ void get_fail(){
queue<int>Q;
for(int i=0;i<26;i++)
if(ch[0][i])Q.push(ch[0][i]);
while(!Q.empty()){
int u=Q.front(); Q.pop();
for(int i=0;i<26;i++){
if(ch[u][i]){
Q.push(ch[u][i]);
fail[ch[u][i]]=ch[fail[u]][i];
}
else ch[u][i]=ch[fail[u]][i];
}
}
return ;
}
/*
求fail指针
这里有一个小技巧,网上许多AC自动机的代码在求fail指针时都需要用到一个while循环
但实际上我们可以将fail指针直接当做此状态的一个儿子,则可以省略掉一个循环(意会一下)
*/ int find(){
int u=0,cnt=0,len=strlen(str);
for(int i=0;i<len;i++){
u=ch[u][str[i]-'a']; int tmp=u;
while(tmp!=0&&!vis[tmp])
cnt+=tag[tmp],vis[tmp]=1,tmp=fail[tmp];
}
return cnt;
}
/*
在自动机上跑文本串
注意一个细节,当你匹配到一个状态时,你也同时匹配到了此状态fail指针指向的状态
(因为那个状态表示的字符串是这个状态的字符串的后缀)所以在计数时也应该计算上它
注意标记不要重复记录
*/

  

关于AC自动机其实还有很多种用途,在此不再赘述。

但大部分都是运用fail指针和树的性质进行匹配和dp等,需要选手结合具体题目灵活处理。

AC自动机简明教程的更多相关文章

  1. HDU2222 (AC自动机)

    AC自动机模板题. 被卡内存了 死活A不掉.. AC自动机参考教程: http://www.cppblog.com/menjitianya/archive/2014/07/10/207604.html ...

  2. AC自动机及KMP练习

    好久都没敲过KMP和AC自动机了.以前只会敲个kuangbin牌板子套题.现在重新写了自己的板子加深了印象.并且刷了一些题来增加自己的理解. KMP网上教程很多,但我的建议还是先看AC自动机(Trie ...

  3. 「LuoguP3808」 【模板】AC自动机(简单版)

    题目背景 通过套取数据而直接“打表”过题者,是作弊行为,发现即棕名. 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. ...

  4. [AC自动机模板]Keywords Search

    只是记录一下代码 AC自动机算法的教程请移步这里 还有这里 指针看着懵逼的还可以看一下这里 #include<iostream> #include<cstdio> #inclu ...

  5. 基于trie树做一个ac自动机

    基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...

  6. AC自动机-算法详解

    What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...

  7. python爬虫学习(11) —— 也写个AC自动机

    0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...

  8. BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]

    2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 2545  Solved: 1419[Submit][Sta ...

  9. BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]

    3172: [Tjoi2013]单词 Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 3198  Solved: 1532[Submit][Status ...

随机推荐

  1. Java实战及解析 — Maven快速入门

    五分钟快速入门 mvn --version mvn archetype:generate -DgroupId=com.mycompany.app -DartifactId=my-app -Darche ...

  2. bzoj1059:[ZJOI2007]矩阵游戏【二分图匹配】

    Description 小Q是一个非常聪明的孩子,除了国际象棋,他还很喜欢玩一个电脑益智游戏——矩阵游戏.矩阵游戏在一个N*N黑白方阵进行(如同国际象棋一般,只是颜色是随意的).每次可以对该矩阵进行两 ...

  3. POJ1256 Anagram

    Time Limit: 1000MS   Memory Limit: 10000KB   64bit IO Format: %lld & %llu Submit Status Descript ...

  4. 洛谷P3406 海底高铁

    题目背景 大东亚海底隧道连接着厦门.新北.博艾.那霸.鹿儿岛等城市,横穿东海,耗资1000亿博艾元,历时15年,于公元2058年建成.凭借该隧道,从厦门可以乘坐火车直达台湾.博艾和日本,全程只需要4个 ...

  5. Topcoder 658Div2

    补题风向标——>> 假装题意知道 A:暴力合成一遍了 n=s.size(); m=t.size(); ss+=s; tt+=t; if (ss==tt) or not; B:题意是给定 1 ...

  6. [Bzoj1767][Ceoi2009]harbingers (树上斜率优化)

    1767: [Ceoi2009]harbingers Time Limit: 10 Sec  Memory Limit: 64 MBSubmit: 451  Solved: 120[Submit][S ...

  7. java基础语法——方法,static关键字

    一:方法: 1.什么是方法: 通俗地讲,方法就是行为.它是完成特定功能的代码块能执行一个功能.它包含于类和对象中. 2.为什么要有方法: *提高代码的复用性. *提高效率 *利于程序维护 3.命名规则 ...

  8. 七天从零基础学习android(1)--配置环境

    在写这篇文的时候android开发经验还是0,是一个萌新,这是一篇记录一个萌新从零android编程基础到能编写一个记账本的开发过程(至少我是这样美好的希望着的) 首先因为是没有开发基础的,直接上百度 ...

  9. java . 请在小于99999的正整数中找符合下列条件的数,它既是完全平方数,又有两位数字相同,如:144,676。

    import java.util.HashMap; import java.util.Map; import java.util.Map.Entry; //请在小于99999的正整数中找符合下列条件的 ...

  10. Eclipse注释模板配置

    不过感觉作用不大,因为@date这些不是标准的Java注释.