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

其实就是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. codeforces 303 div2 E

    赤裸裸的最短路,需要注意下枚举过程就好了.直接贴上别人的代码,发现他的代码挺符合我的风格,以后就这样写了. #include <bits/stdc++.h> ]; ]; ]; ]; vec ...

  2. bzoj 2818 GCD 数论 欧拉函数

    bzoj[2818]Gcd Description 给定整数N,求1<=x,y<=N且Gcd(x,y)为素数的数对(x,y)有多少对. Input 一个整数N Output 如题 Samp ...

  3. Hankson 的趣味题(codevs 1172)

    题目描述 Description Hanks 博士是BT (Bio-Tech,生物技术) 领域的知名专家,他的儿子名叫Hankson.现在,刚刚放学回家的Hankson 正在思考一个有趣的问题.今天在 ...

  4. BZOJ1916: [Usaco2010 Open]冲浪

    n<=50000个点m<=150000的带边权DAG,保证1入度0,n出度0,其他点入度出度均不为0,求:从一号点开始到n,期间有可能K<=10次随机选边走,最坏情况下总边权多少. ...

  5. No route info of this topic

    使用rocketmq时报错 com.alibaba.rocketmq.client.exception.MQClientException: No route info of this topic, ...

  6. mybatis连接mysql加密实现

    参考文章1 参考文章2 直接重写BasicDataSource接口的setPassword方法: 这里同样存在一个问题,就是在重写的方法中,我们可以对password,username 进行解密处理, ...

  7. 解决WordPress安装主题/插件提示输入FTP帐号的问题

    有时比较着急想要安装一款主题或插件,却提示需要输入 FTP 帐号密码……这种情况蛮让人讨厌的,以下就是最完美的解决方法: 方法一:在 wp-config.php 文件加入代码 如果使用的是虚拟主机,可 ...

  8. HDU 1028 整数拆分 HDU 2082 找单词 母函数

    生成函数(母函数) 母函数又称生成函数.定义是给出序列:a0,a1,a2,...ak,...an, 那么函数G(x)=a0+a1*x+a2*x2+....+ak*xk +...+an* xn  称为序 ...

  9. B. Restaurant--cf579B (贪心)

    http://codeforces.com/problemset/problem/597/B 把右节点从小到大排序  在跑一遍就行了 #include <iostream> #includ ...

  10. BZOJ——4195: [Noi2015]程序自动分析

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