链接:

https://www.luogu.org/problem/P3796

题意:

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

思路:

字典树的每个结束节点记录对应的模板串标号, 匹配时记录次数.

代码:

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <vector>
  5. //#include <memory.h>
  6. #include <queue>
  7. #include <set>
  8. #include <map>
  9. #include <algorithm>
  10. #include <math.h>
  11. #include <stack>
  12. #include <string>
  13. #include <assert.h>
  14. #include <iomanip>
  15. #include <iostream>
  16. #include <sstream>
  17. #define MINF 0x3f3f3f3f
  18. using namespace std;
  19. typedef long long LL;
  20. const int MAXN = 2e6+10;
  21. struct Trie
  22. {
  23. int Next[26];
  24. int End;
  25. int Fail;
  26. void Init()
  27. {
  28. memset(Next, 0, sizeof(Next));
  29. End = Fail = 0;
  30. }
  31. }trie[MAXN];
  32. int cnt, n, pos, maxt;
  33. int Ans[MAXN];
  34. char s[MAXN], Pt[200][100];
  35. void Insert(char *t, int id)
  36. {
  37. int len = strlen(t);
  38. int p = 0;
  39. for (int i = 0;i < len;i++)
  40. {
  41. if (trie[p].Next[t[i]-'a'] == 0)
  42. {
  43. trie[p].Next[t[i]-'a'] = ++cnt;
  44. trie[cnt].Init();
  45. }
  46. p = trie[p].Next[t[i]-'a'];
  47. }
  48. trie[p].End = id;
  49. }
  50. void BuildAC()
  51. {
  52. queue<int> que;
  53. for (int i = 0;i < 26;i++)
  54. {
  55. if (trie[0].Next[i] != 0)
  56. que.push(trie[0].Next[i]);
  57. }
  58. while (!que.empty())
  59. {
  60. int u = que.front();
  61. que.pop();
  62. for (int i = 0;i < 26;i++)
  63. {
  64. if (trie[u].Next[i])
  65. {
  66. trie[trie[u].Next[i]].Fail = trie[trie[u].Fail].Next[i];
  67. que.push(trie[u].Next[i]);
  68. }
  69. else
  70. trie[u].Next[i] = trie[trie[u].Fail].Next[i];
  71. //压缩路径, 没有的点直接指向别的节点, 减少向上找的时间
  72. }
  73. }
  74. }
  75. void Query(char *qs)
  76. {
  77. int len = strlen(qs);
  78. int p = 0;
  79. for (int i = 0;i < len;i++)
  80. {
  81. p = trie[p].Next[qs[i]-'a'];
  82. for (int j = p;j != 0 && trie[j].End != -1;j = trie[j].Fail)
  83. {
  84. //将所有能出现的匹配都跑一遍, 同时处理防止多跑.
  85. if (trie[j].End != 0)
  86. {
  87. Ans[trie[j].End]++;
  88. maxt = max(maxt, Ans[trie[j].End]);
  89. }
  90. }
  91. }
  92. }
  93. int main()
  94. {
  95. while (~scanf("%d", &n) && n)
  96. {
  97. memset(Ans, 0, sizeof(Ans));
  98. cnt = pos = maxt = 0;
  99. trie[0].Init();
  100. for (int i = 1;i <= n;i++)
  101. {
  102. scanf("%s", Pt[i]);
  103. Insert(Pt[i], i);
  104. }
  105. scanf("%s", s);
  106. BuildAC();
  107. Query(s);
  108. if (maxt <= 0)
  109. puts("0");
  110. else
  111. {
  112. printf("%d\n", maxt);
  113. for (int i = 1;i <= n;i++)
  114. {
  115. if (Ans[i] == maxt)
  116. puts(Pt[i]);
  117. }
  118. }
  119. }
  120. return 0;
  121. }

洛谷-P3796-AC自动机加强版的更多相关文章

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

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

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

    题目链接:https://www.luogu.com.cn/problem/P3796 AC自动机:复杂度$O( (N+M)\times L )$,N为模式串个数,L为平均长度,M为文章长度. ins ...

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

    洛谷题目传送门 先膜一发yyb巨佬 orz 想学ac自动机的话,推荐一下yyb巨佬的博客,本蒟蒻也是从那里开始学的. 思路分析 裸的AC自动机,这里就不讲了.主要是这题太卡时了,尽管时限放的很大了.. ...

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

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

  5. 洛谷P3808 & P3796 AC自动机模板

    题目:P3808:https://www.luogu.org/problemnew/show/P3808 P3796:https://www.luogu.org/problemnew/show/P37 ...

  6. 洛谷P3796

    题目链接  题意:有n个由小写字母组成的模式串以及一个文本串T.每个模式串可能会在文本串中出现多次.哪些模式串在文本串T中出现的次数最多. 题解:ac自动机模板加强版,开一个数组单独记录各个字符串出现 ...

  7. [codevs1048]石子归并&[codevs2102][洛谷P1880]石子归并加强版

    codevs1048: 题目大意:有n堆石子排成一列,每次可合并相邻两堆,代价为两堆的重量之和,求把他们合并成一堆的最小代价. 解题思路:经典区间dp.设$f[i][j]$表示合并i~j的石子需要的最 ...

  8. 洛谷 P6031 - CF1278F Cards 加强版(推式子+递推)

    洛谷题面传送门 u1s1 这个推式子其实挺套路的吧,可惜有一步没推出来看了题解 \[\begin{aligned} res&=\sum\limits_{i=0}^ni^k\dbinom{n}{ ...

  9. 洛谷 P3808 【模板】AC自动机(简单版)洛谷 P3796 【模板】AC自动机(加强版)

    https://www.cnblogs.com/gtarcoder/p/4820560.html 每个节点的后缀指针fail指针指向: 例如he,she,his,hers的例子(见蓝书P214): 7 ...

  10. cjoj P1435 - 【模板题 USACO】AC自动机 && 洛谷 P3796 【模板】AC自动机(加强版)

    又打了一遍AC自动稽. 海星. 好像是第一次打trie图,很久以前就听闻这个思想了.OrzYYB~ // It is made by XZZ #include<cstdio> #inclu ...

随机推荐

  1. 粒子群优化算法(PSO)的基本概念

    介绍了PSO基本概念,以及和遗传算法的区别: 粒子群算法(PSO)Matlab实现(两种解法)

  2. hdoj3534(树形dp,求树的直径的条数)

    题目链接:https://vjudge.net/problem/HDU-3534 题意:给出一棵树,求树上最长距离(直径),以及这样的距离的条数. 思路:如果只求直径,用两次dfs即可.但是现在要求最 ...

  3. bootstrap-table删除指定行注意事项

    方法有两种: 1.使用官方文档的数据(反正我试了2个小时都不行,如有大神请指导下):使用events和operate相结合的方式 2.不使用events,在formatter里面定义事件的实现. 上面 ...

  4. 打印 request 请求中的参数

    @SuppressWarnings({"rawtypes"})private void showParams(HttpServletRequest request) { Map&l ...

  5. JSP和Servlet异常处理转发

    <error-page> <!-- 指明异常类型. --> <exception-type>java.lang.ArrayIndexOutOfBoundsExcep ...

  6. Oracle数据库连接工具的使用(二)

    一.SQL Plus介绍 1.简介 Oracle的sql plus是与oracle进行交互的客户端工具.在sql plus中,可以运行sql plus命令与sql语句. 我们通常所说的DML.DDL. ...

  7. Netty源码剖析-接受数据

    参考文献:极客时间傅健老师的<Netty源码剖析与实战>Talk is cheap.show me the code! ----主线:worker thread ①多路复用器(Select ...

  8. python-day3(正式学习)

    执行python的两种方式 交互式 优点:运行一句执行一句,方便修改 缺点:关闭即消失,无法保存 命令行式 优点:能一直保存 缺点:代码全部写完才可以调试bug 以后尽量使用pycharm和jupyt ...

  9. 排查RabbitMQ安装错误

    1.注册表中是否有  HKEY_LOCAL_MACHINE\SOFTWARE\Ericsson\Erlang\ErlSrv\1.1\RabbitMQ 此项.(须有) 2.安装目录是否存在中文.(不可有 ...

  10. 使用Docker搭建MySQL服务

    一.安装docker windows 和 mac 版可以直接到官网下载 docker desktop linux 的安装方法可以参考 https://www.cnblogs.com/myzony/p/ ...