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 ...
随机推荐
- 跨主机网络概述 - 每天5分钟玩转 Docker 容器技术(48)
前面已经学习了 Docker 的几种网络方案:none.host.bridge 和 joined 容器,它们解决了单个 Docker Host 内容器通信的问题.本章的重点则是讨论跨主机容器间通信的方 ...
- vscode 开发.net core 从安装到部署 教程详解
一:环境准备: windows系统需要 win7 sp1 / windows 8 / windows 2008 r2 sp1 / windows10: 其他版本的windows系统在安装.NET C ...
- AD7928
实验室板子soc-de1自带的7928芯片,下面记录一下它的参数 吞吐速率 : 1MSPS 吞吐速率 : 是指ADC器件单位时间内能处理的任务数或输出结果的数量.单位:SPS(Samples per ...
- Android学习笔记- ButterKnife 8.0注解使用介绍
前言: App项目开发大部分时候还是以UI页面为主,这时我们需要调用大量的findViewById以及setOnClickListener等代码,控件的少的时候我们还能接受,控件多起来有时候就会有一种 ...
- MySQL优化 - 性能分析与查询优化
优化应贯穿整个产品开发周期中,比如编写复杂SQL时查看执行计划,安装MySQL服务器时尽量合理配置(见过太多完全使用默认配置安装的情况),根据应用负载选择合理的硬件配置等. 1.性能分析 性能分析包含 ...
- 微信小程序(有始有终,全部代码)开发--- 新增【录音】以及UI改进
开篇语 寒假发了一篇练手文章,不出意外地火了: <简年15: 微信小程序(有始有终,全部代码)开发---跑步App+音乐播放器 > 后来又发了BUG修复的版本,出乎意料的火了: 简年18: ...
- 安徽省2016“京胜杯”程序设计大赛_C_箭无虚发
箭无虚发 Time Limit: 1000 MS Memory Limit: 65536 KB Total Submissions: 128 Accepted: 21 Description ...
- 特殊的ip地址
特殊IP地址 一.0.0.0.0 严格说来,0.0.0.0已经不是一个真正意义上的IP地址了.它表示的是这样一个集合:所有不清楚的主机和目的网络.这里的“不清楚”是指在本机的路由表里没有特定条目指明如 ...
- HTML中表格
HTML表格 [表格table] 表格用table表示,表格中的每一行tr表示,一行中的每一列用td表示 th表示的是:表头.表头中的文字,默认为加粗居中.th要放在tr中,用于替换掉td. [tab ...
- Heritrix工具实现网络爬虫
上次用的java相关知识实现了一个简单的网络爬虫,现在存在许多开源免费的爬虫工具,相对来说,可以很简单的获取网页数据,并写入到本地. 下面我就阐述一下我用Heritrix爬虫工具实现网页数据爬取. - ...