题目大意:

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


  传送门

这是一道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. Android - 基于 Speex 的高度封装语音库,0 耦合使用

    作者:林冠宏 / 指尖下的幽灵 掘金:https://juejin.im/user/587f0dfe128fe100570ce2d8 博客:http://www.cnblogs.com/linguan ...

  2. Tomcat结构(转)

    资料:http://wenku.baidu.com/view/20720e78a26925c52cc5bfd6.html Tomcat系统架构 http://wenku.baidu.com/view/ ...

  3. Python零基础学习系列之一--初识计算机!

    1-1.计算机概念: Computer: 原指专门负责计算的人,后来演变成特指计算设备,译为"计算机" 计算机的概念: 计算机是能够根据一组指令操作数据的机器. A compute ...

  4. IoC是什么

    IoC是什么 Ioc-Inversion of Control,即"控制反转",不是什么技术,而是一种设计思想.在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传 ...

  5. ASP.NET Core 源码学习之 Logging[2]:Configure

    在上一章中,我们对 ASP.NET Logging 系统做了一个整体的介绍,而在本章中则开始从最基本的配置开始,逐步深入到源码当中去. 默认配置 在 ASP.NET Core 2.0 中,对默认配置做 ...

  6. nopcommerce数据库字典

    http://www.xcode.me/open/document/nopcommercedatadict.html

  7. 嵌入式linux网络配置

    在开发阶段需要用tftp等开发工具,这时就要配置Linux网络,首先确保windows网络IP地址为固定IP, 1.假设windows IP地址为19.168.2.10子网掩码:255.255.255 ...

  8. 移动端 canvas插入多张图片生成一张可保存到手机图片

    第一次写随笔,想把开发中遇到的问题与大家分享,可能会让您少走一步弯路. 先看下效果图: 代码分三部分为大家展示: 1.html 部分 <div id="myQrcontainer&qu ...

  9. PHP魔术方法

    魔术方法:两个下划线开头的格式. PHP中的魔术方法总结 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, ...

  10. 利用css实现页面加载时旋转动画

    有时浏览一些网站时在刚加载页面时候会出现一个滚动动画如下图,特别是对于一些移动端的站点或者混合应用来说应该用户体验会好很多,扒了下页面发现是用css样式控制的,于是把页面以及css样式赋值了下来, h ...