LA4670 Dominating Patterns(AC自动机)
题意:给n个字符串和一个文本串,输出出现次数最多的字符串
思路:AC自动机,构造Trie的时候,每个节点上的值就是那个字符串的下标加1,找到了可以匹配的时候直接对应的下标数量加1,在输出即可
#include<cstdio>
#include<cstring>
#include<queue>
#include<map>
#include<iostream>
#include<algorithm>
const int maxn = 1e6 + 10;
const int maxSize = 28;
using namespace std;char t[maxn], p[200][100];
int f[maxn], last[maxn], np;
int ch[10600][maxSize], sz;
int val[maxn], num, mp[maxn];void init() {sz = 1; num = 0;memset(mp, 0, sizeof(mp));memset(ch[0], 0, sizeof(ch[0]));memset(val, 0, sizeof(val));memset(f, 0, sizeof(f));
}void build(char *s, int ii) {int u = 0, n = strlen(s);for(int i = 0; i < n; i++) {int c = s[i] - 'a' + 1;if(!ch[u][c]) {memset(ch[sz], 0, sizeof(ch[sz]));ch[u][c] = sz++;}u = ch[u][c];}val[u] = ii;
}void print(int i, int j) {if(!j) return ;///输出以模式串第i个位置结尾的所有可以匹配的给定字符串///printf("%s --> %s\n", t + i - strlen(p[val[j] - 1]) + 1, p[val[j] - 1]);mp[val[j] - 1]++;num = max(num, mp[val[j] - 1]);print(i, last[j]);
}void getfail() {queue<int> q;f[0] = 0;for(int c = 0; c < maxSize; c++) {int u = ch[0][c];if(u) { f[u] = 0; q.push(u); last[u] = 0; }}while(!q.empty()) {int r = q.front(); q.pop();for(int c = 0; c < maxSize; c++) {int u = ch[r][c];if(!u) continue;q.push(u);int v = f[r];while(v && !ch[v][c]) v = f[v];f[u] = ch[v][c];last[u] = val[f[u]] ? f[u] : last[f[u]];}}
}void Find(char *T) {int n = strlen(T), j = 0;for(int i = 0; i < n; i++) {int c = T[i] - 'a' + 1;while(j && !ch[j][c]) j = f[j];j = ch[j][c];if(val[j]) print(i, j);else if(last[j]) print(i, last[j]);}
}int main() {while(scanf("%d", &np) && np) {init();for(int i = 0; i < np; i++) {scanf("%s", p[i]);build(p[i], i + 1);}getfail();scanf("%s", t);Find(t);cout << num << endl;for(int i = 0; i < np; i++) {if(mp[i] == num) cout << p[i] << endl;}}return 0;
}
LA4670 Dominating Patterns(AC自动机)相关推荐
- LA4670 Dominating Patterns[AC自动机]
The archaeologists are going to decipher a very mysterious "language". Now, they know many ...
- AC自动机加强版 uva 1449 - Dominating Patterns
AC自动机最初作用 一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过. 当然这不是AC自动机的全部作用. 本文就是一例,给出几个单词,查询在text里 ...
- LA_4670_Dominating_Patterns_(AC自动机+map)
描述 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- CDOJ1633 Video Game Combos [AC自动机+dp]
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lov ...
- KMP算法、AC自动机算法的原理介绍以及Python实现
KMP算法 要弄懂AC自动机算法,首先弄清楚KMP算法. 这篇文章讲的很好: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E ...
- hihocoder第218周:AC自动机
题目链接 问题描述 给定n个单词,给定一个长字符串s,单词总长度和字符串s的长度都不超过1e5.要求把s中所有的出现单词的位置用*替代. 例如: 样例输入 2 abc cd abcxyzabcd 样例 ...
- 2018北京ICPC H. Approximate Matching(AC自动机+DP)
H : Approximate Matching 时间限制:1000ms,单点时限:1000ms,内存限制:512MB 描述 String matching, a common problem in ...
- HDU 6208 The Dominator of Strings AC自动机
题目链接:HDU 6208 The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others) Memory Limit: 65535 ...
- HDU 6208【假AC自动机+string方法】
题目链接:http://acm.hdu.edu.cn/listproblem.php?vol=1 The Dominator of Strings Time Limit: 3000/3000 MS ( ...
- Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现
多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...
最新文章
- “云智一体”的全场景智能视频技术是什么?
- NIX***检测方法
- Android开发之Service通过Messenger实现线程间的通信
- 自己动手实现OpenGL-OpenGL原来如此简单(二)
- IntelliJ IDEA(2017)安装和破解
- MySQL5.6开启慢查询
- Python一些字符串判断和转换
- 四十三、在Vue使用router,路由的管理
- Oracle数据库分页的三种方法
- 【POJ - 1050】To the Max (dp)
- Windows平台基于RTMP实现一对一互动直播
- ALV的颜色分为行的颜色、列的颜色和CELL的颜色
- Tomcat根目录下work文件夹的作用
- 【报告分享】直播电商生态进化论-2020直播电商行业研究报告.pdf(附下载链接)...
- Agile敏捷开发Planning Poker简介
- CPU过载、内存溢出分析
- python f检验 模型拟合度_模型评估指标(RMSE、MSE、MAE、R2准确率、召回率、F1、ROC曲线、AUC曲线、PR曲线)...
- css透明度兼容问题opacity
- 2021年高压电工新版试题及高压电工试题及解析
- 第1阶段C++ 匠心之作 从0到1入门