AC自动机简明教程
不会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自动机简明教程的更多相关文章
- HDU2222 (AC自动机)
AC自动机模板题. 被卡内存了 死活A不掉.. AC自动机参考教程: http://www.cppblog.com/menjitianya/archive/2014/07/10/207604.html ...
- AC自动机及KMP练习
好久都没敲过KMP和AC自动机了.以前只会敲个kuangbin牌板子套题.现在重新写了自己的板子加深了印象.并且刷了一些题来增加自己的理解. KMP网上教程很多,但我的建议还是先看AC自动机(Trie ...
- 「LuoguP3808」 【模板】AC自动机(简单版)
题目背景 通过套取数据而直接“打表”过题者,是作弊行为,发现即棕名. 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. ...
- [AC自动机模板]Keywords Search
只是记录一下代码 AC自动机算法的教程请移步这里 还有这里 指针看着懵逼的还可以看一下这里 #include<iostream> #include<cstdio> #inclu ...
- 基于trie树做一个ac自动机
基于trie树做一个ac自动机 #!/usr/bin/python # -*- coding: utf-8 -*- class Node: def __init__(self): self.value ...
- AC自动机-算法详解
What's Aho-Corasick automaton? 一种多模式串匹配算法,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一. 简单的说,KMP用来在一篇文章中匹配一个模式串:但 ...
- python爬虫学习(11) —— 也写个AC自动机
0. 写在前面 本文记录了一个AC自动机的诞生! 之前看过有人用C++写过AC自动机,也有用C#写的,还有一个用nodejs写的.. C# 逆袭--自制日刷千题的AC自动机攻克HDU OJ HDU 自 ...
- BZOJ 2434: [Noi2011]阿狸的打字机 [AC自动机 Fail树 树状数组 DFS序]
2434: [Noi2011]阿狸的打字机 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 2545 Solved: 1419[Submit][Sta ...
- BZOJ 3172: [Tjoi2013]单词 [AC自动机 Fail树]
3172: [Tjoi2013]单词 Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 3198 Solved: 1532[Submit][Status ...
随机推荐
- 配置standby redo log
Data Guard在最大保护和最高可用性模式下,Standby数据库必须配置standby redo log,通过下面的实验展示创建的原则和过程. 1.原则1).standby redo log的文 ...
- [HNOI2004]宠物收养场(Treap)
洛谷传送门 这题真是恶心,一开始没理解题意. 原来如果有狗,狗就会存在收养场中,直到有人来领养: 如果有人,人也会存在收养场中,直到有狗来被领养. 就是建一个treap,狗来把狗插进去,人来后把狗领养 ...
- docker容器的导入导出
导出容器docker export 导出容器快照到本地文件$ sudo docker ps -aCONTAINER ID IMAGE COMMAND ...
- hihoCoder #1055 : 刷油漆 [ 树形dp ]
传送门 结果:Accepted 提交时间:2015-05-11 10:36:08 #1055 : 刷油漆 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 上回说到 ...
- msp430项目编程01
msp430中项目---点阵LED显示 1.点阵LED介绍 2.代码(直接使用引脚驱动) 3.代码(使用芯片驱动) 4.项目总结 msp430项目编程 msp430入门学习
- codeforces 1041 d 二分
题意转化:有一些区间,要求选一些连续的区间.两两区间间隔的和要求小于H.要求区间的长度和尽可能长. 二分区间长度的和,check一下就行 #include <bits/stdc++.h> ...
- [bzoj2595][WC2008]游览计划/[bzoj5180][Baltic2016]Cities_斯坦纳树
游览计划 bzoj-2595 wc-2008 题目大意:题目链接.题目连接. 注释:略. 想法:裸题求斯坦纳树. 斯坦纳树有两种转移方式,设$f[s][i]$表示联通状态为$s$,以$i$为根的最小代 ...
- FM算法及FFM算法
转自:http://tech.meituan.com/deep-understanding-of-ffm-principles-and-practices.html http://blog.csdn. ...
- 【stl学习笔记】红黑树
转自维基百科 红黑树是一种平衡二叉搜索树,它可以在O(log n)时间内做查找,插入和删除,这里的n是树中元素的数目. 性质: 红黑树是每个节点都带有颜色属性的二叉查找树,颜色为红色或黑色.在二叉查找 ...
- 如何删除Windows 7的保留分区
Windows 7的保留分区可以删除,但是必须小心.启动到Windows 7,运行具有管理员权限的CMD.exe,然后输入:diskpartsel disk 0list volsel vol 0 (你 ...