AC自动机(加强版)
题目描述
有NN个由小写字母组成的模式串以及一个文本串TT。每个模式串可能会在文本串中出现多次。你需要找出哪些模式串在文本串TT中出现的次数最多。
输入输出格式
输入格式:
输入含多组数据。
每组数据的第一行为一个正整数NN,表示共有NN个模式串,1 \leq N \leq 1501≤N≤150。
接下去NN行,每行一个长度小于等于7070的模式串。下一行是一个长度小于等于10^6106的文本串TT。
输入结束标志为N=0N=0。
输出格式:
对于每组数据,第一行输出模式串最多出现的次数,接下去若干行每行输出一个出现次数最多的模式串,按输入顺序排列。
输入输出样例
2
aba
bab
ababababac
6
beta
alpha
haha
delta
dede
tata
dedeltalphahahahototatalpha
0
4
aba
2
alpha
haha ac自动机,last指针版
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
const int maxn = ;
int n;
char s[maxn][];
char ss[maxn*];
int ans=;
struct Aho_Corasick_automato {
int sz;
int ch[maxn][];
int cnt[maxn];
int val[maxn];
int last[maxn];
int fail[maxn];
int num;
void init() {
memset(ch[],,sizeof(ch[]));
memset(cnt,,sizeof(cnt));
sz=;
}
void insert(char *s,int num) {
int len=strlen(s);
int u=;
for(int i=; i<len; ++i) {
int v=(s[i]-'a');
if(!ch[u][v]) {
memset(ch[sz],,sizeof(ch[sz]));
val[sz]=;
ch[u][v]=sz++;
}
u=ch[u][v];
}
val[u]=num;
}
void get_fail() {
fail[]=;
queue<int>que;
for(int i=; i<; i++) {
int u=ch[][i];
if(u) {
fail[u]=;
que.push(u);
}
}
while(!que.empty()) {
int u=que.front();
que.pop();
for(int i=; i<; i++) {
int v=ch[u][i];
if(!v) {
ch[u][i]=ch[fail[u]][i];
continue;
}
que.push(v);
int k=fail[u];
fail[v]=ch[k][i];
last[v]=val[fail[v]] ? fail[v] : last[fail[v]];
}
}
}
void work(int x) {
if(x) {
cnt[val[x]]++;
work(last[x]);
}
}
void find(char *s) {
int len=strlen(s);
int u=;
for(int i=; i<len; i++) {
int v=(s[i]-'a');
if(!ch[u][v])u=fail[u];
while(u&&!ch[u][v])
u=fail[u];
u=ch[u][v];
if(val[u])
work(u);
else if(last[u])
work(last[u]);
}
}
} ac; int main() { while(scanf("%d",&n)==&&n!=) {
ac.init();
for(int i=; i<=n; i++) {
scanf("%s",s[i]);
ac.insert(s[i],i);
}
ac.get_fail();
scanf("%s",ss);
ac.find(ss);
int ans=,r;
for(int i=;i<=n;i++)
if(ac.cnt[i]>ans)ans=ac.cnt[i],r=i;;
printf("%d\n",ans);
for(int r=;r<=n;r++)
if(ac.cnt[r]==ans)
printf("%s\n",s[r]);
}
return ;
}
AC自动机(加强版)的更多相关文章
- [模板][P3796]AC自动机(加强版)
Description: 输出有哪些模式串在文本串中出现次数最多,这个次数是多少 Hint: 多组数据,$ len_{文本串}<=10^6,\sum len_{模式串} <= 70*150 ...
- 【模板】AC自动机加强版
题目大意:给定 N 个模式串和一个文本串,求每个模式串在文本串中出现的次数. 题解:文本串在自动机上匹配的过程中,记录下自动机上每一个状态被访问的次数.对于访问到的节点 i,则状态 i 的后缀中存在的 ...
- AC自动机(简单版)(施工ing)
声明 想看加强版的戳这里(施工ing,作者正努力中)~ 先贴题目吧哎~ AC自动机加强版 洛谷 P3796 题目: 洛谷 P3808 (数据范围困了我好久 TAT) 反正涉及字符串的算法都很玄学 ...
- AC自动机例题
P3808 [模板]AC自动机(简单版) [题目描述] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. #include<bits/stdc++.h> using name ...
- AC自动机讲解超详细
begin:2019/5/2 感谢大家支持! AC自动机详细讲解 AC自动机真是个好东西!之前学KMP被Next指针搞晕了,所以咕了许久都不敢开AC自动机,近期学完之后,发现AC自动机并不是很难,特别 ...
- 洛谷P3796 - 【模板】AC自动机(加强版)
原题链接 Description 模板题啦~ Code //[模板]AC自动机(加强版) #include <cstdio> #include <cstring> int co ...
- P3796 【模板】AC自动机(加强版)
P3796 [模板]AC自动机(加强版) https://www.luogu.org/problemnew/show/P3796 题目描述 有NN个由小写字母组成的模式串以及一个文本串TT.每个模式串 ...
- 【题解】P3796【模板】AC自动机(加强版)
[题解]P3796 [模板]AC自动机(加强版) 记录当前\(cnt\)是第几个"星".记录第几个串是对应着第几个星. 这里补充一点对于\(AC\)自动机的理解.可能一直有个问题我 ...
- luogu3808 luogu3796 AC自动机(简单版) AC自动机(加强版)
纪念一下我一晚上写了八遍AC自动机 这是加强版的: #include <iostream> #include <cstring> #include <cstdio> ...
- 「LuoguP3796」 【模板】AC自动机(加强版)
题目描述 有N个由小写字母组成的模式串以及一个文本串T.每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串T中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据. 每组数据的第一 ...
随机推荐
- 建立,查询二叉树 hdu 5444
Elven Postman Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Others)T ...
- pidgin中使用QQ
安装 实现的功能: 可以发送静态表情 可以发送动态表情 可以发图片? 可以添加好友 可以添加群?
- Linux学习-磁盘配额 (Quota) 的应用与实作
什么是 Quota 在 Linux 系统中,由于是多人多任务的环境,所以会有多人共同使用一个硬盘空间的情况发生, 如 果其中有少数几个使用者大量的占掉了硬盘空间的话,那势必压缩其他使用者的使用权力! ...
- Selenium2用最简xpath查找元素
什么是xpath? 来自百度百科的解释:XPath即为XML路径语言,它是一种用来确定XML(标准通用标记语言的子集)文档中某部分位置的语言.XPath基于XML的树状结构,提供在数据结构树中找寻节点 ...
- luogu3178 [HAOI2015]树上操作
裸题 #include <iostream> #include <cstdio> using namespace std; typedef long long ll; int ...
- 微信小程序的那些坑
早闻微信小程序是个坑,结果名不虚传,细数一下我开发小程序遇过到坑. 1.UI组件过度封装. 微信小程序的组件是模仿react.js或vue.js的web组件设计的,并且封装了weui.css样式. P ...
- ant 入门级详解
ant 入门级详解 [转载的地址(也是转载,未找到原文地址)]https://www.cnblogs.com/jsfx/p/6233645.html 1,什么是antant是构建工具2,什么是构建 ...
- python - 接口自动化 - 接口测试基础知识
# -*- coding:utf-8 -*- '''@project: jiaxy@author: Jimmy@file: study_接口测试基础知识一.py@ide: PyCharm Commun ...
- 基于 K8S 构建数据中心操作系统
在 12 月 22 日 ECUG 的下午场 ,七牛云容器计算部技术总监袁晓沛为大家带来了主题为<基于 K8S 的 DCOS 之路>的精彩分享,向大家介绍了七牛容器云目前 K8S 的状况和产 ...
- 【bzoj1283】序列 线性规划与费用流
题目描述 给出一个长度为 的正整数序列Ci,求一个子序列,使得原序列中任意长度为 的子串中被选出的元素不超过K(K,M<=100) 个,并且选出的元素之和最大. 输入 第1行三个数N,m,k. ...