不会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. 【转】关于大型网站技术演进的思考(十九)--网站静态化处理—web前端优化—上(11)

    网站静态化处理这个系列马上就要结束了,今天我要讲讲本系列最后一个重要的主题web前端优化.在开始谈论本主题之前,我想问大家一个问题,网站静态化处理技术到底是应该归属于web服务端的技术范畴还是应该归属 ...

  2. 公钥加密算法那些事 | RSA 与 ECC 系统对比

    一.背景 据记载,公元前 400 年,古希腊人发明了置换密码.1881 年世界上的第一个电话保密专利出现.在第二次世界大战期间,德国军方启用「恩尼格玛」密码机,密码学在战争中起着非常重要的作用. 随着 ...

  3. gerrit ssh 登陆设置

    [root@web ~]# cat ~/.ssh/config Host gerrit User deploy-gerrit Port Hostname gerrit.demo.com Identit ...

  4. python学习之-- assert断言

    assert 断言作用:断言是声明其布尔值必须为真的判定,如果发生异常就说明表达示为假.可以理解assert断言语句为raise-if-not,用来测试表示式,其返回值为假,就会触发异常.举例如下:a ...

  5. codeforces #302Div1 A

    对于 我这样的弱者就需要一道一道 简单的题 来慢慢补了. 看懂 题意很重要: 又一次被自己的英语吓哭了,做了两天发现题目看错,结果样例都对了, 硬是过不了: 给 n,m,b,mod; 在给n 个数 a ...

  6. Spring Boot中实现logback多环境日志配置

    在Spring Boot中,可以在logback.xml中的springProfile标签中定义多个环境logback.xml: <springProfile name="produc ...

  7. Spring Boot项目错误:Error parsing lifecycle processing instructions

    pom.xml文件错误:Error parsing lifecycle processing instructions 解决方法:清空.m2/repository下的所有依赖文件,重新下载即可解决该问 ...

  8. [vxlan] 一 Why VXLAN

    想了解一个事物/概念,最好的办法是知道它是为什么出现的,为了解决那些问题而出现.这里,就用这种方式来学习一下VXLAN VXLAN (Virtual eXtensible Local Area Net ...

  9. jenkins节约硬盘空间的几个办法

    jenkins真是费硬盘和内存,我们先聊聊硬盘问题怎么解决: 1.不要保留太多的构建记录.发布包数量 相关描述如下:取最先匹配进行执行 2.构建完,删除吧

  10. 【转】Web Worker javascript多线程编程(一)

    原文:https://www.cnblogs.com/peakleo/p/6218823.html -------------------------------------------------- ...