hdu2222 Keywords Search(AC自动机初步)
题目大意:
给出多个模式串和一个主串,求多少个模式串在主串中出现过。
这是一道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自动机初步)的更多相关文章
- hdu2222 Keywords Search ac自动机
地址:http://acm.split.hdu.edu.cn/showproblem.php?pid=2222 题目: Keywords Search Time Limit: 2000/1000 MS ...
- HDU2222 Keywords Search [AC自动机模板]
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- HDU2222 Keywords Search —— AC自动机
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 Keywords Search Time Limit: 2000/1000 MS (Java/O ...
- hdu2222 KeyWords Search AC自动机入门题
/** 链接:http://acm.hdu.edu.cn/showproblem.php?pid=2222 题意:题意:给定N(N <= 10000)个长度不大于50的模式串,再给定一个长度为L ...
- HDU2222 Keywords Search ac自动机第一题
指针我一般都会出错,所以还是自己写数组版本. In the modern time, Search engine came into the life of everybody like Google ...
- hdu2222 Keywords Search (AC自动机板子
https://vjudge.net/problem/HDU-2222 题意:给几个模式串和一个文本串,问文本串中包含几个模式串. 思路:贴个板子不解释. #include<cstdio> ...
- 【HDU2222】Keywords Search AC自动机
[HDU2222]Keywords Search Problem Description In the modern time, Search engine came into the life of ...
- [hdu2222] [AC自动机模板] Keywords Search [AC自动机]
AC自动机模板,注意!ch,Fail,lab数组的大小不是n而是节点个数,需要认真计算! #include <iostream> #include <algorithm> #i ...
- Keywords Search(AC自动机模板)
Keywords Search Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others ...
- Keywords Search AC自动机
In the modern time, Search engine came into the life of everybody like Google, Baidu, etc. Wiskey al ...
随机推荐
- 计算机网络之应用层_part -1
应用层协议原理 一.网络应用程序体系结构 网络应用程序体系结构是由程序研发者设计的,规定了如何在各种端系统中组织该应用程序,主要流行的有两种: 1.客户--服务器体系结构: 有一个总是打开的主机(称为 ...
- 用runtime封装归档(encoding)
runtime一套比较基层的c语言的API(库) 归档(OC对象-->字典—>2进制—>写入沙盒 || 目的.数据持久化) #import <UIKit/UIKit.h&g ...
- Hbase单机安装部署
Hbase单机安装部署 http://blogxinxiucan.sh1.newtouch.com/2017/07/27/Hbase单机安装部署/ 下载Hbase Hbase官网下载地址 http:/ ...
- 蓝桥杯比赛javaB组练习《生日蜡烛》
题目如下: 生日蜡烛 某君从某年开始每年都举办一次生日party,并且每次都要吹熄与年龄相同根数的蜡烛. 现在算起来,他一共吹熄了236根蜡烛. 请问,他从多少岁开始过生日party的? 请填写他开始 ...
- year:2017 month:7 day:20
2017-07-20 JavaScript(Dom) 1:获取节点对象 document.getElementById("html元素的id") document.getEleme ...
- C#使用Xamarin开发可移植移动应用目录
Xamarin.Android系列 C#开发移动应用系列(1.环境搭建) C#开发移动应用系列(2.使用WebView搭建WebApp应用) C#开发移动应用系列(3.使用照相机扫描二维码+各种基础知 ...
- recycleView 使用指南1
最近看了很多 recycleView 的使用文章,一直晕乎乎的,完全不知道套路是啥.很多人都是直接上代码,但是却没有详细说明代码的使用,于是打算自己写写,理理思路.顺便帮助那些正在学习 android ...
- Shell - 简明Shell编程
本文是对Shell脚本编程的总结和回顾,所有涉及的脚本均已做了基本的调试和验证. [toc] 测试环境信息 [root@CentOS7 ~]# uname -a Linux CentOS7 3.10. ...
- 关于socket通信bind()返回值错误:10049
这个问题,我差点和客户吵起来了.我的电脑确实没有问题,客户电脑却会经常出现,.今天查了下,居然是这种问题,大意了,在这里记录下. 服务器端程序开启的时候总是提示:bind错误,用WSAGetLastE ...
- AIX缩小逻辑卷报错chfs: 0506-964
--AIX缩小逻辑卷报错chfs: 0506-964 -----------------------------------------2013/10/29 通过smit chfs/或 chfs命令 ...