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 ...
随机推荐
- Oracle和MySQL分组查询GROUP BY
Oracle和MySQL分组查询GROUP BY 真题1.Oracle和MySQL中的分组(GROUP BY)有什么区别? 答案:Oracle对于GROUP BY是严格的,所有要SELECT出来的字段 ...
- myeclipse项目部署到idea常见问题
由于myeclipse是付费产品,经过几次破解不成功后,遂弃之,转投IntelliJ IDEA门下.但这就出现一个问题了,以前用的eclipse.myeclipse以及spring tools sui ...
- 微信小程序-滚动消息通知
写在前面: 微信小程序学的不太多,做了一个简单的项目,回来很快时间内把在深圳两天的房租给赚回来了. 这次我主要想总结一下微信小程序实现上下滚动消息提醒,主要是利用swiper组件来实现,swiper组 ...
- centos7启动过程及systemd祥细说明
开机启过程 POST->BOOT SEQUENCE-> BOOTLOADER->KERNEL + INITRAMFS(INITRD)->ROOTFS->/sbin/ini ...
- Java之线程,常用方法,线程同步,死锁
1, 线程的概念 进程与线程 进程:每个进程都有独立的代码和数据空间(进程上下文),进程间的切换会有较大的开销,一个进程包含1--n个线程.(进程是资源分配的最小单位) 线程:同一类线程共享代码和数据 ...
- Uva 679 Dropping Ballls 二叉树的编号
这个程序常规处理起来数据量很大,I可以高达2^D-1 /* ....... */ 里面的代码块据此避免了开太大的数组 做太多的循环 #include<cstdio> #include< ...
- 第二棵树:Splay
Splay这东西神难打--什么都没动板子敲上就直逼200行了,而且非常难记(仿佛是模板长的必然结果).但是为什么还要学呢?据说是因为它可以实现区间操作.但是自从我得知无旋Treap也能做到这些,默默对 ...
- JS基础学习篇(一)
近来一直在学习js和jquery.刚刚进入前端工作还没有多久,虽然大学里学习的是编程自认为也学的还可以,但前端接触的不多,一直认为前端十分简单.其实不然,特别是工作的时候要自己设计一个完整的项目前端, ...
- HPU--1221 Fibonacci数列
题目描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1. 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少. 输入 输入包含一个整数n. ...
- Fluent Validation with Web Api 2
using FluentValidation;using FluentValidation.Attributes;using System;using System.Collections.Gener ...