题目描述

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

输入输出格式

输入格式:

输入含多组数据。

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

接下去NNN行,每行一个长度小于等于707070的模式串。下一行是一个长度小于等于10610^6106的文本串TTT。

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

输出格式:

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

输入输出样例

输入样例#1: 复制

2
aba
bab
ababababac
6
beta
alpha
haha
delta
dede
tata
dedeltalphahahahototatalpha
0

输出样例#1: 复制

4
aba
2
alpha
haha

模板;
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
#include<map>
#include<set>
#include<vector>
#include<queue>
#include<bitset>
#include<ctime>
#include<deque>
#include<stack>
#include<functional>
#include<sstream>
//#include<cctype>
//#pragma GCC optimize(2)
using namespace std;
#define maxn 200005
#define inf 0x7fffffff
//#define INF 1e18
#define rdint(x) scanf("%d",&x)
#define rdllt(x) scanf("%lld",&x)
#define rdult(x) scanf("%lu",&x)
#define rdlf(x) scanf("%lf",&x)
#define rdstr(x) scanf("%s",x)
typedef long long  ll;
typedef unsigned long long ull;
typedef unsigned int U;
#define ms(x) memset((x),0,sizeof(x))
const long long int mod = 1e9 + 7;
#define Mod 1000000000
#define sq(x) (x)*(x)
#define eps 1e-3
typedef pair<int, int> pii;
#define pi acos(-1.0)
//const int N = 1005;
#define REP(i,n) for(int i=0;i<(n);i++)
typedef pair<int, int> pii;
inline ll rd() {ll x = 0;char c = getchar();bool f = false;while (!isdigit(c)) {if (c == '-') f = true;c = getchar();}while (isdigit(c)) {x = (x << 1) + (x << 3) + (c ^ 48);c = getchar();}return f ? -x : x;
}ll gcd(ll a, ll b) {return b == 0 ? a : gcd(b, a%b);
}
int sqr(int x) { return x * x; }/*ll ans;
ll exgcd(ll a, ll b, ll &x, ll &y) {if (!b) {x = 1; y = 0; return a;}ans = exgcd(b, a%b, x, y);ll t = x; x = y; y = t - a / b * y;return ans;
}
*/string mode[maxn];
struct tree {int fail;int vis[30];int num;
}ac[maxn];
int ans[maxn];
int n, siz;void ins(string s, int v) {int now = 0;for (int i = 0; i < s.length(); i++) {int o = s[i] - 'a';if (!ac[now].vis[o])ac[now].vis[o] = ++siz;now = ac[now].vis[o];}ac[now].num = v;
}void getfail() {int now = 0;queue<int>q;for (int i = 0; i < 26; i++) {if (ac[0].vis[i]) {q.push(ac[0].vis[i]);ac[ac[0].vis[i]].fail = 0;}}while (!q.empty()) {int u = q.front(); q.pop();for (int i = 0; i < 26; i++) {if (ac[u].vis[i]) {ac[ac[u].vis[i]].fail = ac[ac[u].fail].vis[i];q.push(ac[u].vis[i]);}else {ac[u].vis[i] = ac[ac[u].fail].vis[i];}}}
}void query(string s) {int now = 0;for (int i = 0; i < s.length(); i++) {now = ac[now].vis[s[i] - 'a'];for (int j = now; j; j = ac[j].fail)ans[ac[j].num]++;}
}int main() {ios::sync_with_stdio(0);while (cin >> n && n) {ms(ac); siz = 0; ms(ans);for (int i = 1; i <= n; i++) {cin >> mode[i];ins(mode[i], i);}getfail();string k; cin >> k;query(k);int tmp = 0;for (int i = 1; i <= n; i++) {tmp = max(tmp, ans[i]);}cout << tmp << endl;for (int i = 1; i <= n; i++) {if (ans[i] == tmp) {cout << mode[i] << endl;}}}return 0;
}

转载于:https://www.cnblogs.com/zxyqzy/p/10252380.html

【模板】AC自动机(加强版)相关推荐

  1. 模板 - AC自动机

    ACM-ICPC模板 目录 求有多少个模式串在文本串里出现过 建fail树dfs求每个模式串在文本串中的出现次数 ac自动机fail树上dfs序建可持久化线段树 AC自动机是一种多模匹配算法 AC自动 ...

  2. HDU 2222 ACAM模板(AC自动机)

    这里找到了两篇很nice的Trie树(作者Hackbuteer1)以及AC自动机(作者niushuai666)入门详解.博主写的可以说是非常用心了,一看就懂. 题意:给出N(<=10000)个单 ...

  3. AC自动机加强版 uva 1449 - Dominating Patterns

    AC自动机最初作用  一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过. 当然这不是AC自动机的全部作用. 本文就是一例,给出几个单词,查询在text里 ...

  4. 提高篇 第二部分 字符串算法 第4章 AC自动机

    https://blog.csdn.net/wangyh1008/article/details/81428056 [模板]AC自动机(加强版) 洛谷3796 AC自动机_A_loud_name-CS ...

  5. AC自动机讲解超详细

    begin:2019/5/2 update 2020/6/12 更新了LaTeX(咕了好久 感谢大家支持! AC自动机详细讲解 AC自动机真是个好东西!之前学KMPKMPKMP被NextNextNex ...

  6. ac自动机 匹配最长前缀_AC自动机算法

    AC自动机简介: 首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包 ...

  7. P5357 【模板】AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数)

    P5357 [模板]AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数) 传送门 形式上,AC 自动机基于由若干模式串构成的 Trie 树,并在此之上增加了一些 fail 边:本质 ...

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

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

  9. P5357 【模板】AC自动机(二次加强版) fail树

    传送门 文章目录 题意: 思路: 题意: 思路: 这个只能搞failfailfail树了,让后跑一遍即可. 重复的字符串记一个,让后其他的都跟他一个答案即可. // Problem: P3796 [模 ...

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

    嘟嘟嘟 这个和某谷的AC自动机模板简单版差不多. 但还是要注意几点的: 1.这个是统计出现次数,而不是是否出现,所以在查询的时候加上这个节点的val后,不能把val标记为-1.那么也就可以说查询的时间 ...

最新文章

  1. 机器学习算法(3:决策树算法)
  2. 预编译 ASP.NET 网站以进行部署
  3. 第2关:利用栈判断字符串括号是否匹配
  4. mysql+select+unlock_MySQL的locktables和unlocktables的用法(转载)
  5. Method Overloading
  6. h3c 路由器 刷第三方固件_图文版*许迎果 第201期 双11路由器型号推荐之刷机路由篇...
  7. 音视频技术开发周刊 | 186
  8. 信用卡套现只要正常还款,银行是不是睁只眼闭只眼?
  9. .net mvc 超过了最大请求长度 限制文件上传大小
  10. CoreCLR源码探索(三) GC内存分配器的内部实现
  11. 带你掌握C++中三种类成员初始化方式
  12. Android系统性能优化(44)---全面详细的内存优化指南
  13. 百度地图的一个有价值的应用
  14. skills --札记
  15. 猜数游戏--MOOC中习题
  16. 印刷体汉字识别matlab实现,如何用MATLAB仿真印刷体汉字识别系统?
  17. 20155305《网络对抗》信息搜集与漏洞扫描
  18. sql优化之终极方案
  19. c语言中while(a)、if(a)、while(!a)、if(!a)、if(%a)是什么意思?
  20. 故意伤害罪具体会有什么处罚

热门文章

  1. Spring的配置文件详解
  2. html5 head 标签
  3. springMVC获取异步请求的参数,返回异步请求数据(json),跨域访问简单了解,文件上传,与Restful风格
  4. 细说Android apk四代签名:APK v1、APK v2、APK v3、APK v4
  5. Orchard详解--第一篇 介绍
  6. 在线小词典(mysql扩展库操作)
  7. Nancy 学习-视图引擎 继续跨平台
  8. 【Python②】python之首秀
  9. 第十八章 4string 字符串的合并
  10. 最好用的枚举多选方法