【模板】AC自动机(加强版)
题目描述
有NNN个由小写字母组成的模式串以及一个文本串TTT。每个模式串可能会在文本串中出现多次。你需要找出哪些模式串在文本串TTT中出现的次数最多。
输入输出格式
输入格式:
输入含多组数据。
每组数据的第一行为一个正整数NNN,表示共有NNN个模式串,1≤N≤1501 \leq N \leq 1501≤N≤150。
接下去NNN行,每行一个长度小于等于707070的模式串。下一行是一个长度小于等于10610^6106的文本串TTT。
输入结束标志为N=0N=0N=0。
输出格式:
对于每组数据,第一行输出模式串最多出现的次数,接下去若干行每行输出一个出现次数最多的模式串,按输入顺序排列。
输入输出样例
2 aba bab ababababac 6 beta alpha haha delta dede tata dedeltalphahahahototatalpha 0
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自动机(加强版)相关推荐
- 模板 - AC自动机
ACM-ICPC模板 目录 求有多少个模式串在文本串里出现过 建fail树dfs求每个模式串在文本串中的出现次数 ac自动机fail树上dfs序建可持久化线段树 AC自动机是一种多模匹配算法 AC自动 ...
- HDU 2222 ACAM模板(AC自动机)
这里找到了两篇很nice的Trie树(作者Hackbuteer1)以及AC自动机(作者niushuai666)入门详解.博主写的可以说是非常用心了,一看就懂. 题意:给出N(<=10000)个单 ...
- AC自动机加强版 uva 1449 - Dominating Patterns
AC自动机最初作用 一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过. 当然这不是AC自动机的全部作用. 本文就是一例,给出几个单词,查询在text里 ...
- 提高篇 第二部分 字符串算法 第4章 AC自动机
https://blog.csdn.net/wangyh1008/article/details/81428056 [模板]AC自动机(加强版) 洛谷3796 AC自动机_A_loud_name-CS ...
- AC自动机讲解超详细
begin:2019/5/2 update 2020/6/12 更新了LaTeX(咕了好久 感谢大家支持! AC自动机详细讲解 AC自动机真是个好东西!之前学KMPKMPKMP被NextNextNex ...
- ac自动机 匹配最长前缀_AC自动机算法
AC自动机简介: 首先简要介绍一下AC自动机:Aho-Corasick automation,该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一.一个常见的例子就是给出n个单词,再给出一段包 ...
- P5357 【模板】AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数)
P5357 [模板]AC自动机(二次加强版)(AC自动机建fail树dfs求模式串出现次数) 传送门 形式上,AC 自动机基于由若干模式串构成的 Trie 树,并在此之上增加了一些 fail 边:本质 ...
- P3796 【模板】AC自动机(加强版)
P3796 [模板]AC自动机(加强版) https://www.luogu.org/problemnew/show/P3796 题目描述 有NN个由小写字母组成的模式串以及一个文本串TT.每个模式串 ...
- P5357 【模板】AC自动机(二次加强版) fail树
传送门 文章目录 题意: 思路: 题意: 思路: 这个只能搞failfailfail树了,让后跑一遍即可. 重复的字符串记一个,让后其他的都跟他一个答案即可. // Problem: P3796 [模 ...
- luogu P3796【模板】AC自动机(加强版)
嘟嘟嘟 这个和某谷的AC自动机模板简单版差不多. 但还是要注意几点的: 1.这个是统计出现次数,而不是是否出现,所以在查询的时候加上这个节点的val后,不能把val标记为-1.那么也就可以说查询的时间 ...
最新文章
- 机器学习算法(3:决策树算法)
- 预编译 ASP.NET 网站以进行部署
- 第2关:利用栈判断字符串括号是否匹配
- mysql+select+unlock_MySQL的locktables和unlocktables的用法(转载)
- Method Overloading
- h3c 路由器 刷第三方固件_图文版*许迎果 第201期 双11路由器型号推荐之刷机路由篇...
- 音视频技术开发周刊 | 186
- 信用卡套现只要正常还款,银行是不是睁只眼闭只眼?
- .net mvc 超过了最大请求长度 限制文件上传大小
- CoreCLR源码探索(三) GC内存分配器的内部实现
- 带你掌握C++中三种类成员初始化方式
- Android系统性能优化(44)---全面详细的内存优化指南
- 百度地图的一个有价值的应用
- skills --札记
- 猜数游戏--MOOC中习题
- 印刷体汉字识别matlab实现,如何用MATLAB仿真印刷体汉字识别系统?
- 20155305《网络对抗》信息搜集与漏洞扫描
- sql优化之终极方案
- c语言中while(a)、if(a)、while(!a)、if(!a)、if(%a)是什么意思?
- 故意伤害罪具体会有什么处罚