不会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. python学习笔记--python数据类型

    一.整形和浮点型 整形也就是整数类型(int)的,在python3中都是int类型,没有什么long类型的,比如说存年龄.工资.成绩等等这样的数据就可以用int类型,有正整数.负整数和0,浮点型的也就 ...

  2. HDU 3973 线段树+字符串hash

    题目大意: 不断修改字符串中的字母,然后询问区间字符串是否处于已给定的字符串集合中 这里将原来的字符串集合保存到hash表中,当然用map,set都没有问题 修改查询都用线段树实现,自己的query函 ...

  3. CSU 1307 最短路+二分

    题目大意: 帮忙找到一条a到b的最短路,前提是要保证路上经过的站点的最大距离尽可能短 这道题居然要用到二分...完全没去想过,现在想想求最大距离的最小值确实是... 这里不断二分出值代入spfa()或 ...

  4. poj2446 Chessboard 【最大匹配】

    题目大意:一个n*m的棋盘,某些格子不能用,问用1*2的骨牌能否完全覆盖这个棋盘,当然,骨牌不能有重叠 思路:显然黑白染色后,一个骨牌只能覆盖一个白色格子和一个黑色格子,然后我们间二染色建图,看能否有 ...

  5. bzoj4027 [HEOI2015]兔子与樱花 树上贪心

    [HEOI2015]兔子与樱花 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 1320  Solved: 762[Submit][Status][Di ...

  6. [转]fedora国内源常见配置

    1.参考:1.http://mirrors.ustc.edu.cn/2.http://mirrors.fedoraproject.org/publiclist#CN3.http://mirrors.n ...

  7. Linux MTD (Memory Technology Device) subsystem analysis -For Atheros char device

    Linux MTD (Memory Technology Device) subsystem analysis For Atheros char device 读了Linux MTD 源代码分析 对这 ...

  8. [CERC2015]Digit Division

    题目描述 We are given a sequence of n decimal digits. The sequence needs to be partitioned into one or m ...

  9. EF关联

    public CustomerMap() { this.ToTable("Customer"); this.HasKey(c => c.Id); this.Property( ...

  10. firedac数据集的序列和还原

    procedure TForm1.Button1Click(Sender: TObject);var stream, stream2: TMemoryStream; buf: TBytes;begin ...