题意:给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自动机)相关推荐

  1. LA4670 Dominating Patterns[AC自动机]

    The archaeologists are going to decipher a very mysterious "language". Now, they know many ...

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

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

  3. LA_4670_Dominating_Patterns_(AC自动机+map)

    描述 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  4. CDOJ1633 Video Game Combos [AC自动机+dp]

    题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lov ...

  5. KMP算法、AC自动机算法的原理介绍以及Python实现

    KMP算法 要弄懂AC自动机算法,首先弄清楚KMP算法. 这篇文章讲的很好: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E ...

  6. hihocoder第218周:AC自动机

    题目链接 问题描述 给定n个单词,给定一个长字符串s,单词总长度和字符串s的长度都不超过1e5.要求把s中所有的出现单词的位置用*替代. 例如: 样例输入 2 abc cd abcxyzabcd 样例 ...

  7. 2018北京ICPC H. Approximate Matching(AC自动机+DP)

    H : Approximate Matching 时间限制:1000ms,单点时限:1000ms,内存限制:512MB 描述 String matching, a common problem in ...

  8. HDU 6208 The Dominator of Strings AC自动机

    题目链接:HDU 6208 The Dominator of Strings Time Limit: 3000/3000 MS (Java/Others)    Memory Limit: 65535 ...

  9. HDU 6208【假AC自动机+string方法】

    题目链接:http://acm.hdu.edu.cn/listproblem.php?vol=1 The Dominator of Strings Time Limit: 3000/3000 MS ( ...

  10. Aho-Corasick 多模式匹配算法(AC自动机) 的算法详解及具体实现

    多模式匹配 多模式匹配就是有多个模式串P1,P2,P3-,Pm,求出所有这些模式串在连续文本T1-.n中的所有可能出现的位置. 例如:求出模式集合{"nihao","ha ...

最新文章

  1. “云智一体”的全场景智能视频技术是什么?
  2. NIX***检测方法
  3. Android开发之Service通过Messenger实现线程间的通信
  4. 自己动手实现OpenGL-OpenGL原来如此简单(二)
  5. IntelliJ IDEA(2017)安装和破解
  6. MySQL5.6开启慢查询
  7. Python一些字符串判断和转换
  8. 四十三、在Vue使用router,路由的管理
  9. Oracle数据库分页的三种方法
  10. 【POJ - 1050】To the Max (dp)
  11. Windows平台基于RTMP实现一对一互动直播
  12. ALV的颜色分为行的颜色、列的颜色和CELL的颜色
  13. Tomcat根目录下work文件夹的作用
  14. 【报告分享】直播电商生态进化论-2020直播电商行业研究报告.pdf(附下载链接)...
  15. Agile敏捷开发Planning Poker简介
  16. CPU过载、内存溢出分析
  17. python f检验 模型拟合度_模型评估指标(RMSE、MSE、MAE、R2准确率、召回率、F1、ROC曲线、AUC曲线、PR曲线)...
  18. css透明度兼容问题opacity
  19. 2021年高压电工新版试题及高压电工试题及解析
  20. 第1阶段C++ 匠心之作 从0到1入门

热门文章

  1. python怎么读取xls文件
  2. 安工大计算机学院李雪,计算机学院本科生党支部召开党员大会
  3. WAMP安装与基础配置
  4. 三进制计算机未来的发展趋势,如果研制出三进制计算机会怎样?
  5. 【php环境搭建/wamp/解释器/下载】
  6. 游戏性能优化的五个方向
  7. js根据给定颜色生成更亮/暗/颜色
  8. 1.操作系统的基本特性和主要功能
  9. 为什么游戏需要热更新
  10. ubuntu网络检查服务器端口是否开放