题目大意:

  给出多个模式串和一个主串,求多少个模式串在主串中出现过。


  传送门

这是一道AC自动机的模板题。

在学习AC自动机之前,首先要学习WA自动机、TLE自动机和MLE自动机(雾

AC自动机是一种多模式串匹配算法。

AC自动机概述:

  *fail指针:指向失配时的匹配节点;

  1)构建字典树

  2)初始化fail指针:

    一条$fail$指针链可以理解为一个串连所有后缀相同的字符串的链表,并且所有链表的末端都指向trie的根。我们定义沿着节点$v$的$fail$指针走到根部的路径为v的trie链表

    虚线为$fail$指针,红色节点为AC-DFA的接收态。

    使用BFS构造fail指针:初始化队列为树根。对于trie上的每个非叶子节点$u$的孩子$v$,我们沿着其fail链表向上走,直到某个节点的孩子$x=v$,则$v->fail=x$。将$v$加入队列。

    特别的,对于$p->nxt[i]==NULL$的节点,令$p->nxt[i]=p->fail->nxt[i]$

  3)由于初始化$fail$指针的时候,令$p->nxt[i]=p->fail->nxt[i]$,所以现在的trie树变成了一个trie图,所有节点的$nxt$指针都不为空。我们按照主串,沿着相应的路径向走trie图,每访问一个节点就遍历该节点的$fail$链表并计数。

代码:

 #include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cctype>
#define foru(i,x,y) for(int i=x;i<=y;i++)
const int N=1e6+; struct trie{
trie *nxt[];
trie *fail;
int v;
void init(){v=;foru(i,,)nxt[i]=NULL;fail=NULL;}
};
trie *r,*q[];
int T,n;
char ch[N];
void add(char *s){//建trie
trie *k=r,*p;
int l=strlen(s);
foru(i,,l-){
int id=s[i]-'a';
if(!k->nxt[id]){
p=(trie*)malloc(sizeof(trie));
p->init();
k->nxt[id]=p;
k=p;
}else{
k=k->nxt[id];
}
}
k->v++;//标记为接收态
} void setfail(){
trie *k;
int s=,t=;
q[++t]=r;
while(s<=t){
k=q[s++];
foru(i,,){
if(k->nxt[i]){
trie *p=k->fail;
while(p&&!p->nxt[i])p=p->fail;//寻找上一个相同后缀的字符串
k->nxt[i]->fail=(!p?r:p->nxt[i]);//不存在则指向trie根
q[++t]=k->nxt[i];
}else
k->nxt[i]=(k==r?r:k->fail->nxt[i]);
}
}
} int find(char *s){
trie *k=r,*p;int ret=;
int l=strlen(s);
foru(i,,l-){
int id=s[i]-'a';
k=k->nxt[id];
p=k;
while(p){//遍历fail链
ret+=p->v;
p->v=;//避免重复计数
p=p->fail;
}
}
return ret;
} int main(){
scanf("%d",&T);
while(T--){
r=(trie*)malloc(sizeof(trie));
r->init();
scanf("%d",&n);
foru(i,,n){
scanf("%s",ch);
add(ch);
}
setfail();
scanf("%s",ch);
printf("%d\n",find(ch));
}
}

hdu2222 Keywords Search(AC自动机初步)的更多相关文章

  1. hdu2222 Keywords Search ac自动机

    地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2222 题目: Keywords Search Time Limit: 2000/1000 MS ...

  2. HDU2222 Keywords Search [AC自动机模板]

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  3. HDU2222 Keywords Search —— AC自动机

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 Keywords Search Time Limit: 2000/1000 MS (Java/O ...

  4. hdu2222 KeyWords Search AC自动机入门题

    /** 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:题意:给定N(N <= 10000)个长度不大于50的模式串,再给定一个长度为L ...

  5. HDU2222 Keywords Search ac自动机第一题

    指针我一般都会出错,所以还是自己写数组版本. In the modern time, Search engine came into the life of everybody like Google ...

  6. hdu2222 Keywords Search (AC自动机板子

    https://vjudge.net/problem/HDU-2222 题意:给几个模式串和一个文本串,问文本串中包含几个模式串. 思路:贴个板子不解释. #include<cstdio> ...

  7. 【HDU2222】Keywords Search AC自动机

    [HDU2222]Keywords Search Problem Description In the modern time, Search engine came into the life of ...

  8. [hdu2222] [AC自动机模板] Keywords Search [AC自动机]

    AC自动机模板,注意!ch,Fail,lab数组的大小不是n而是节点个数,需要认真计算! #include <iostream> #include <algorithm> #i ...

  9. Keywords Search(AC自动机模板)

    Keywords Search Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others ...

  10. Keywords Search AC自动机

    In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey al ...

随机推荐

  1. dubbo搭建例子

    现在很多公司用到dubbo,使用起来是很快就学会了.真的要熟悉它还是要花点功夫的. 前面尝试看了些它的源码,这里为了调试源码,先打搭一个能跑的项目,顺别分享出来,以便刚像学习的朋友节约时间,毕竟时间至 ...

  2. 1分钟选好最合适你的JavaScript框架

    欢迎大家持续关注葡萄城控件技术团队博客,更多更好的原创文章尽在这里~~​ Javascript框架(以下简称框架)也被称为Javascript库,是一组包含丰富功能和函数的JavaScript代码集, ...

  3. Linux常用命令和常见问题解决<------>第一章

    查看文件下面所有的隐藏目录:ls -al ~ ls -al ~ls -a -l ~可以发现三条命令执行结果是一致的,原因:因为ls为命令 后面的参数要以空格来区分,不论几个空格 shell都会视为一体 ...

  4. Python:使用Kivy将python程序打包为apk文件

    1.概述 Kivy是一套Python下的跨平台开源应用开发框架,官网,我们可以用 它来将Python程序打包为安卓的apk安装文件.以下是在windows环境中使用. 安装和配置的过程中会下载很多东西 ...

  5. Openresty使用Thrift安装步骤

    最新想用Golang与Openresty相互通讯调用,使用RPC协议来实现,后来研究最终选择了Thrift:主要还是FB实现了支持Lua和Go模块,直接编译就可以成功嵌套使用,非常方便:研究了两天最后 ...

  6. golang 之验证码api

    知识一:如何返回一个json数据? 先定义一个结构体ResponseData,2个参数,并返回的是json数据,key就是json后定义的名称 type ResponseData struct { S ...

  7. Appium环境搭建(Windows版)

    Appium介绍 Appium是一个开源.跨平台的测试框架,可以用来测试原生及混合的移动端应用.Appium支持iOS.Android及FirefoxOS平台.Appium使用WebDriver的js ...

  8. ios 加密

    0728 加密 MD5加密 可解 因为有MD5库 但是可以通过 加盐(也就是拼接字符串  在进行加密)的方法进行加密这样在解得时候就不会那么容易 也可以使用时间戳 进行加盐 加密 时间戳 可只用到分钟 ...

  9. 在Eclipse下运行Jmeter3.0源代码

    1.创建项目 准备工作:在http://jmeter.apache.org/download_jmeter.cgi中分别下载binaries和source两个压缩包,前者为release版本,后者则为 ...

  10. Unity3D --对撞机/碰撞器 介绍

    碰撞器一般都用作触发器而用,刚体一般用作真实碰撞. 静态对撞机:一个对象有对撞机组件,没有刚体组件. 这种情况在场景中的静态物体应用较多,比如墙体,房屋等静止不动的物体. 物理引擎假设静态对撞机是不会 ...