学习笔记::AC自动机
最先开始以为和自动刷题机是一个东西。。。
其实就是kmp的一个拓展。学完kmp再学这个就会发现其实不难
1.kmp是一个串匹配一个串,但是当我们想用多个串匹配一个文本的时候,kmp就不行了,因此我们有了AC自动机
2.很明显我们用单词去匹配文本是肯定要一个一个枚举单词去匹配的,那么我们换个思路,用文本去匹配串。
3.AC自动机的原理:我不是很懂,口胡一下:
1.建立一颗trie,读入单词后把单词一个一个插入到trie
3.进行文本匹配。把文本放到AC自动机上。想象一下:把AC自动机的root看成一个入口,把串的开头放进去,串一个一个字符地跑进自动机里,每个字符都对应上了一个节点。(要不为什么叫自动机)
#include<bits/stdc++.h>
using namespace std;
#define N 1000010
struct trie
{
int ch[],fail,val,vis;
}t[N>>];
int n,root,ans,cnt;
char s[N];
int q[N];
void ins(char s[])
{
int now=root,len=strlen(s+);
for(int i=;i<=len;i++)
{
int x=s[i]-'a';
if(!t[now].ch[x]) t[now].ch[x]=++cnt;
now=t[now].ch[x];
}
t[now].val++;
}
void construct_AC()
{
int l=,r=;
q[++r]=root;
while(l<=r)
{
int u=q[l++];
for(int i=;i<;i++)
{
int v=t[u].ch[i]; if(!v) continue;
if(u==root) t[v].fail=root;
else
{
int now=t[u].fail;
while(now!=root&&!t[now].ch[i]) now=t[now].fail;
if(t[now].ch[i]) now=t[now].ch[i];
t[v].fail=now;
}
q[++r]=v;
}
}
}
void AC(char s[])
{
int len=strlen(s+),now=root;
for(int i=;i<=len;i++)
{
int u=s[i]-'a';
while(now!=root&&!t[now].ch[u]) now=t[now].fail;
if(t[now].ch[u])
{
now=t[now].ch[u];
for(int pos=now;pos!=root&&!t[pos].vis;pos=t[pos].fail)
{
ans+=t[pos].val; t[pos].vis=;
}
}
}
}
int main()
{
int T; scanf("%d",&T);
while(T--)
{
memset(t,,sizeof(t)); ans=; cnt=;
scanf("%d",&n);
for(int i=;i<=n;i++)
{
scanf("%s",s+);
ins(s);
}
construct_AC();
scanf("%s",s+);
AC(s);
printf("%d\n",ans);
}
return ;
}
学习笔记::AC自动机的更多相关文章
- [一本通学习笔记] AC自动机
AC自动机可以看作是在Trie树上建立了fail指针,在这里可以看作fail链.如果u的fail链指向v,那么v的对应串一定是u对应串在所给定字符串集合的后缀集合中的最长的后缀. 我们考虑一下如何实现 ...
- SAM学习笔记&AC自动机复习
形势所迫,一个对字符串深恶痛绝的鸽子又来更新了. SAM 后缀自动机就是一个对于字符串所有后缀所建立起的自动机.一些优良的性质可以使其完成很多字符串的问题. 其核心主要在于每个节点的状态和$endpo ...
- [学习笔记]后缀自动机SAM
好抽象啊,早上看了两个多小时才看懂,\(\%\%\%Fading\) 早就懂了 讲解就算了吧--可以去看看其他人的博客 1.[模板]后缀自动机 \(siz\) 为该串出现的次数,\(l\) 为子串长度 ...
- AC自动机--summer-work之我连模板题都做不出
这章对现在的我来说有点难,要是不写点东西,三天后怕是就一无所有了. 但写这个没有营养的blog的目的真的不是做题或提升,只是学习学习代码和理解一些概念. 现在对AC自动机的理解还十分浅薄,这里先贴上目 ...
- Keywords Search - HDU 2222(AC自动机模板)
题目大意:输入几个子串,然后输入一个母串,问在母串里面包含几个子串. 分析:刚学习的AC自动机,据说这是个最基础的模板题,所以也是用了最基本的写法来完成的,当然也借鉴了别人的代码思想,确实是个很神 ...
- AC自动机专题总结
最近学习了AC自动机,做了notonlysuccess大牛里面的题,也该来个总结了. AC自动机(Aho-Corasick Automaton)在1975年产生于贝尔实验室,是著名的多模匹配算法之一. ...
- fzu 2246(ac 自动机)
fzu 2246(ac 自动机) 题意: 某一天YellowStar学习了AC自动机,可以解决多模式匹配问题.YellowStart当然不会满足于此,它想进行更深入的研究. YellowStart有一 ...
- SAM学习笔记
SAM学习笔记 后缀自动机(模板)NSUBSTR(Caioj1471 || SPOJ 8222) [题意] 给出一个字符串S(S<=250000),令F(x)表示S的所有长度为x的子串中,出现次 ...
- AC自动机学习笔记-2(Trie图&&last优化)
我是连月更都做不到的蒟蒻博主QwQ 考虑到我太菜了,考完noip就要退役了,所以我决定还是把博客的倒数第二篇博客给写了,也算是填了一个坑吧.(最后一篇?当然是悲怆のnoip退役记啦QAQ) 所以我们今 ...
随机推荐
- 【最长上升子序列记录路径(n^2)】HDU 1160 FatMouse's Speed
https://vjudge.net/contest/68966#problem/J [Accepted] #include<iostream> #include<cstdio> ...
- websocket个人理解总结
WebSocket 释义:聊天室.服务.套接字.协议 引用:https://www.ibm.com/developerworks/cn/web/1112_huangxa_websocket/index ...
- winrar5.0破解
RAR registration data Federal Agency for Education 1000000 PC usage license UID=b621cca9a84bc5deffbf ...
- Sencha Touch 2 实现跨域访问
最近要做手机移动App,最后采用HTMML5来做框架用Sencha Touch,在数据交互时遇到了Ajax跨域访问,在Sencha Touch 2中,实现跨域访问可以使用Ext类库提供给我们的类Ext ...
- [NOIP1999] 普及组
回文数 /*By SilverN*/ #include<algorithm> #include<iostream> #include<cstring> #inclu ...
- poj1470 Closest Common Ancestors [ 离线LCA tarjan ]
传送门 Closest Common Ancestors Time Limit: 2000MS Memory Limit: 10000K Total Submissions: 14915 Ac ...
- python学习之-- redis模块管道/订阅发布
redis 模块操作剩余其他常用操作 delete(*names):删除任意的数据类型exists(name):检测redis的name是否存在keys(pattern='*'):根据模型获取redi ...
- codeforces 875F(基环外向树)
题意 有一个左边m个点,右边n个点的二分图(n,m<=1e5),左边每个点向右边恰好连两条权值相同的边. 求这个二分图的最优匹配 分析 对于这种二选一问题,即左边的a连向右边的b和c,权值为d, ...
- maven之基础
一.配置maven的环境 下载地址:http://maven.apache.org/download.cgi(window下载(Binary zip)的) 将maven解压,然后配置环境变量打开: 计 ...
- Java基础教程:tutorialspoint-java
来自turorialspoint的Java基础教程(英文),官网:https://www.tutorialspoint.com/java/index.htm 这个教程在国内已经被翻译成中文(不过是属于 ...