题目描述

有NN个由小写字母组成的模式串以及一个文本串TT。每个模式串可能会在文本串中出现多次。你需要找出哪些模式串在文本串TT中出现的次数最多。

输入输出格式

输入格式:

输入含多组数据。

每组数据的第一行为一个正整数NN,表示共有NN个模式串,1 \leq N \leq 1501≤N≤150。

接下去NN行,每行一个长度小于等于7070的模式串。下一行是一个长度小于等于10^610​6​​的文本串TT。

输入结束标志为N=0N=0。

输出格式:

对于每组数据,第一行输出模式串最多出现的次数,接下去若干行每行输出一个出现次数最多的模式串,按输入顺序排列。

输入输出样例

输入样例#1:

2
aba
bab
ababababac
6
beta
alpha
haha
delta
dede
tata
dedeltalphahahahototatalpha
0
输出样例#1:

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自动机(加强版)的更多相关文章

  1. [模板][P3796]AC自动机(加强版)

    Description: 输出有哪些模式串在文本串中出现次数最多,这个次数是多少 Hint: 多组数据,$ len_{文本串}<=10^6,\sum len_{模式串} <= 70*150 ...

  2. 【模板】AC自动机加强版

    题目大意:给定 N 个模式串和一个文本串,求每个模式串在文本串中出现的次数. 题解:文本串在自动机上匹配的过程中,记录下自动机上每一个状态被访问的次数.对于访问到的节点 i,则状态 i 的后缀中存在的 ...

  3. AC自动机(简单版)(施工ing)

    声明 想看加强版的戳这里(施工ing,作者正努力中)~ 先贴题目吧哎~   AC自动机加强版  洛谷 P3796 题目: 洛谷 P3808 (数据范围困了我好久 TAT) 反正涉及字符串的算法都很玄学 ...

  4. AC自动机例题

    P3808 [模板]AC自动机(简单版) [题目描述] 给定n个模式串和1个文本串,求有多少个模式串在文本串里出现过. #include<bits/stdc++.h> using name ...

  5. AC自动机讲解超详细

    begin:2019/5/2 感谢大家支持! AC自动机详细讲解 AC自动机真是个好东西!之前学KMP被Next指针搞晕了,所以咕了许久都不敢开AC自动机,近期学完之后,发现AC自动机并不是很难,特别 ...

  6. 洛谷P3796 - 【模板】AC自动机(加强版)

    原题链接 Description 模板题啦~ Code //[模板]AC自动机(加强版) #include <cstdio> #include <cstring> int co ...

  7. P3796 【模板】AC自动机(加强版)

    P3796 [模板]AC自动机(加强版) https://www.luogu.org/problemnew/show/P3796 题目描述 有NN个由小写字母组成的模式串以及一个文本串TT.每个模式串 ...

  8. 【题解】P3796【模板】AC自动机(加强版)

    [题解]P3796 [模板]AC自动机(加强版) 记录当前\(cnt\)是第几个"星".记录第几个串是对应着第几个星. 这里补充一点对于\(AC\)自动机的理解.可能一直有个问题我 ...

  9. luogu3808 luogu3796 AC自动机(简单版) AC自动机(加强版)

    纪念一下我一晚上写了八遍AC自动机 这是加强版的: #include <iostream> #include <cstring> #include <cstdio> ...

  10. 「LuoguP3796」 【模板】AC自动机(加强版)

    题目描述 有N个由小写字母组成的模式串以及一个文本串T.每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串T中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据. 每组数据的第一 ...

随机推荐

  1. matplotlib 设置图形大小时 figsize 与 dpi 的关系

    matplotlib 中设置图形大小的语句如下: fig = plt.figure(figsize=(a, b), dpi=dpi) 其中: figsize 设置图形的大小,a 为图形的宽, b 为图 ...

  2. leetcode-25-exercise_string&array

    14. Longest Common Prefix Write a function to find the longest common prefix string amongst an array ...

  3. FIFO buffer 和普通buffer区别

    1.FIFO可以说一块具体的硬件存储设备,也可以说程序在内存中开辟的一段内存区域.而buffer往往就是一段缓冲的数据区域 2.FIFO的数据是先进先出的,而buffer没有这个限制,可以全局访问 3 ...

  4. python——全局变量&局部变量

    >>> count = 5 >>> def function(): count = 10 print(10) >>> function() 10 ...

  5. JS中如何操作数组

    背景:随笔中所应用到的代码来自于上一篇随笔,MVC&JQuery如何根据List动态生成表格,部分代码不再重复. 代码如下: $("#btnTan").click(func ...

  6. 光学字符识别OCR-2

    灰度聚类 接着我们就对图像的色彩进行聚类.聚类的有两个事实依据:         1.灰度分辨率   肉眼的灰度分辨率大概为40,因此对于像素值254和255,在我们肉眼看来都 只是白色:       ...

  7. hdu1787 GCD Again poj 2478 Farey Sequence 欧拉函数

    hdu1787,直接求欧拉函数 #include <iostream> #include <cstdio> using namespace std; int n; int ph ...

  8. luogu2123 皇后游戏

    好题. 网上看到的范围是:\(T \leq 10\),$ n \leq 50000$, $ a_i,b_i \leq 10^9$. 我们按照贪心惯常的思路考虑交换相邻的两个人.容易发现,对于相邻的两个 ...

  9. Mongodb 删除记录里的某个字段

    //例如要把User表中address字段删除 db.User.update({},{$unset:{'address':''}},false, true)

  10. TransH中的Hinge Loss Function

    Hinge Loss Function Hinge Loss 函数一种目标函数,有时也叫max-margin objective. 在Trans系列中,有一个 \[ \max(0,f(h,r,t) + ...