最先开始以为和自动刷题机是一个东西。。。

其实就是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自动机的更多相关文章

  1. [一本通学习笔记] AC自动机

    AC自动机可以看作是在Trie树上建立了fail指针,在这里可以看作fail链.如果u的fail链指向v,那么v的对应串一定是u对应串在所给定字符串集合的后缀集合中的最长的后缀. 我们考虑一下如何实现 ...

  2. SAM学习笔记&AC自动机复习

    形势所迫,一个对字符串深恶痛绝的鸽子又来更新了. SAM 后缀自动机就是一个对于字符串所有后缀所建立起的自动机.一些优良的性质可以使其完成很多字符串的问题. 其核心主要在于每个节点的状态和$endpo ...

  3. [学习笔记]后缀自动机SAM

    好抽象啊,早上看了两个多小时才看懂,\(\%\%\%Fading\) 早就懂了 讲解就算了吧--可以去看看其他人的博客 1.[模板]后缀自动机 \(siz\) 为该串出现的次数,\(l\) 为子串长度 ...

  4. AC自动机--summer-work之我连模板题都做不出

    这章对现在的我来说有点难,要是不写点东西,三天后怕是就一无所有了. 但写这个没有营养的blog的目的真的不是做题或提升,只是学习学习代码和理解一些概念. 现在对AC自动机的理解还十分浅薄,这里先贴上目 ...

  5. Keywords Search - HDU 2222(AC自动机模板)

    题目大意:输入几个子串,然后输入一个母串,问在母串里面包含几个子串.   分析:刚学习的AC自动机,据说这是个最基础的模板题,所以也是用了最基本的写法来完成的,当然也借鉴了别人的代码思想,确实是个很神 ...

  6. AC自动机专题总结

    最近学习了AC自动机,做了notonlysuccess大牛里面的题,也该来个总结了. AC自动机(Aho-Corasick Automaton)在1975年产生于贝尔实验室,是著名的多模匹配算法之一. ...

  7. fzu 2246(ac 自动机)

    fzu 2246(ac 自动机) 题意: 某一天YellowStar学习了AC自动机,可以解决多模式匹配问题.YellowStart当然不会满足于此,它想进行更深入的研究. YellowStart有一 ...

  8. SAM学习笔记

    SAM学习笔记 后缀自动机(模板)NSUBSTR(Caioj1471 || SPOJ 8222) [题意] 给出一个字符串S(S<=250000),令F(x)表示S的所有长度为x的子串中,出现次 ...

  9. AC自动机学习笔记-2(Trie图&&last优化)

    我是连月更都做不到的蒟蒻博主QwQ 考虑到我太菜了,考完noip就要退役了,所以我决定还是把博客的倒数第二篇博客给写了,也算是填了一个坑吧.(最后一篇?当然是悲怆のnoip退役记啦QAQ) 所以我们今 ...

随机推荐

  1. Http、TCP/IP、Socket的区别

    网络由下往上分为 物理层.数据链路层.网络层.传输层.会话层.表示层和应用层. 通过初步的了解,我知道IP协议对应于网络层,TCP协议对应于传输层,而HTTP协议对应于应用层, 三者从本质上来说没有可 ...

  2. Piggy-Bank--hdu1114(完全背包)

    http://acm.hdu.edu.cn/showproblem.php?pid=1114 Problem Description Before ACM can do anything, a bud ...

  3. BZOJ——2697: 特技飞行

    http://www.lydsy.com/JudgeOnline/problem.php?id=2697 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: ...

  4. [Bzoj2500]幸福的道路(树上最远点)

    2500: 幸福的道路 Time Limit: 20 Sec  Memory Limit: 256 MBSubmit: 474  Solved: 194[Submit][Status][Discuss ...

  5. [Bzoj2286][Sdoi2011]消耗战(虚树模板题附讲解)

    2286: [Sdoi2011]消耗战 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 4896  Solved: 1824[Submit][Statu ...

  6. http 连接失败重连机制

    1.我们做web开发时,需要经常使用httpclient来请求http服务,有时为了安全起见,服务提供方会提供多个http地址,这样如果我们请求某个ip出现异常,可以重试其他的ip地址,来尽量保证系统 ...

  7. eclipse设置全局编码为UTF-8的方法

    1.windows->Preferences...打开"首选项"对话框,左侧导航树,导航到general->Workspace,右侧Text file encoding ...

  8. 地球Gauss_Kruger中央0度经线图

  9. Excel小tips - 如何设置表格输入数字后末尾自动添加%

    选中一列——鼠标右键——设置单元格格式——数字——自定义——0% 按照以上操作完成后,点击确定,就大功告成了.

  10. 随机森林、gbdt算法

    http://blog.csdn.net/songzitea/article/details/10035757 http://blog.csdn.net/holybin/article/details ...