题目描述

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

输入输出格式

输入格式:

输入含多组数据。

每组数据的第一行为一个正整数,表示共有个模式串,

接下去行,每行一个长度小于等于的模式串。下一行是一个长度小于等于的文本串

输入结束标志为

输出格式:

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

输入输出样例

输入样例#1:

  1. 2
  2. aba
  3. bab
  4. ababababac
  5. 6
  6. beta
  7. alpha
  8. haha
  9. delta
  10. dede
  11. tata
  12. dedeltalphahahahototatalpha
  13. 0
输出样例#1:

  1. 4
  2. aba
  3. 2
  4. alpha
  5. haha
  6.  
  7. 个人认为没有什么特别大的变化,记录一下,然后简单运用一下,就ok了,纯裸题,不过用c++自带的queue貌似有些慢,
    应该可以优化一下。
  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cmath>
  4. #include<iostream>
  5. #include<cstring>
  6. #include<queue>
  7. using namespace std;
  8.  
  9. int n,cnt=,fzy[];
  10. char s[][];
  11. struct Node
  12. {
  13. int c[],suf,flag,mark;
  14. void init()
  15. {
  16. suf=flag=mark=;
  17. memset(c,,sizeof(c));
  18. }
  19. }tree[];
  20.  
  21. void init()
  22. {
  23. memset(fzy,,sizeof(fzy));
  24. for (int i=;i<=cnt;i++)
  25. tree[i].init();
  26. cnt=;
  27. }
  28. void Ins(int num)
  29. {
  30. int head=,l=strlen(s[num]);
  31. for (int i=;i<l;i++)
  32. {
  33. int now=s[num][i]-'a';
  34. if (!tree[head].c[now]) tree[head].c[now]=++cnt;
  35. head=tree[head].c[now];
  36. }
  37. tree[head].flag++,tree[head].mark=num;
  38. }
  39. void Make_AC()
  40. {
  41. for (int i=;i<;i++) tree[].c[i]=;
  42. int head=,tail=;
  43. queue<int>q;
  44. while (!q.empty()) q.pop();
  45. tree[].suf=;
  46. q.push();
  47. while (!q.empty())
  48. {
  49. int u=q.front();
  50. q.pop();
  51. for (int i=;i<;i++)
  52. if (tree[u].c[i])
  53. {
  54. tree[tree[u].c[i]].suf=tree[tree[u].suf].c[i];
  55. q.push(tree[u].c[i]);
  56. }
  57. else tree[u].c[i]=tree[tree[u].suf].c[i];
  58. }
  59. }
  60. void Solve()
  61. {
  62. char s1[];
  63. scanf("%s",s1);
  64. int head=,len=strlen(s1);
  65. for (int i=;i<len;i++)
  66. {
  67. int now=s1[i]-'a';
  68. head=tree[head].c[now];
  69. for (int j=head;j&&tree[j].flag!=-;j=tree[j].suf)
  70. fzy[tree[j].mark]+=tree[j].flag;
  71. }
  72. int x=fzy[];
  73. for (int i=;i<=n;i++)
  74. if (x<fzy[i]) x=fzy[i];
  75. printf("%d\n",x);
  76. for (int i=;i<=n;i++)
  77. if (x==fzy[i]) printf("%s\n",s[i]);
  78. }
  79. int main()
  80. {
  81. while (scanf("%d",&n)&&n)
  82. {
  83. init();
  84. for (int i=;i<=n;i++)
  85. {scanf("%s",s[i]);Ins(i);}
  86. Make_AC();
  87. Solve();
  88. }
  89. }
  1.  

【模板】AC自动机(加强版)的更多相关文章

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

    传送门 ac自动机模板,可能我写的ac自动机是有点问题的,所以跑的有些慢 暴力跳fail统计 代码: #include<cstdio> #include<iostream> # ...

  2. luoguP3808[模板]AC自动机(简单版)

    传送门 ac自动机模板题,裸的多串匹配 代码: #include<cstdio> #include<iostream> #include<algorithm> #i ...

  3. 算法模板——AC自动机

    实现功能——输入N,M,提供一个共计N个单词的词典,然后在最后输入的M个字符串中进行多串匹配(关于AC自动机算法,此处不再赘述,详见:Aho-Corasick 多模式匹配算法.AC自动机详解.考虑到有 ...

  4. 模板 AC自动机

    题目描述 有$N$ 个由小写字母组成的模式串以及一个文本串$T$ .每个模式串可能会在文本串中出现多次.你需要找出哪些模式串在文本串$T$ 中出现的次数最多. 输入输出格式 输入格式: 输入含多组数据 ...

  5. 算法竞赛模板 AC自动机

    AC自动机基本操作 (1) 在AC自动机中,我们首先将每一个模式串插入到Trie树中去,建立一棵Trie树,然后构建fail指针. (2) fail指针,是穿插在Trie树中各个结点之间的指针,顾名思 ...

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

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

  7. 【模板】AC自动机加强版

    题目大意:给定 N 个模式串和一个文本串,求每个模式串在文本串中出现的次数. 题解:文本串在自动机上匹配的过程中,记录下自动机上每一个状态被访问的次数.对于访问到的节点 i,则状态 i 的后缀中存在的 ...

  8. 洛谷.3808/3796.[模板]AC自动机

    题目链接:简单版,增强版 简单版: #include <cstdio> #include <cstring> const int N=1e6+5,S=26; char s[N] ...

  9. 模板—AC自动机

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; struct ...

  10. 模板——AC自动机

    传送门:QAQQAQ 定义nxt[u]=v表示从u开始不断沿着失配边跳到的第一个是标记点的端点v,那么我们再匹配时沿着last跳,每跳到一个last,它就一定对应一个模式串,所以效率是非常高的. 和K ...

随机推荐

  1. 关于Java的静态:静态类、静态方法、静态变量、静态块等

    原文地址:Java static keyword - Class, Method, Variable, Block, import - JournalDev 很少看到文章能把静态这个问题解释的很清楚, ...

  2. 慕课网视频破解付费分享-前端开发-Python等

    微信小程序 慕课网   BAT大牛经验总结全面深入解读Android面试   前端JS基础面试技巧   vue2.0+node.js+mongodb全栈打造商城   Vue.js高级实战-开发移动端音 ...

  3. spring事务失效情况分析

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt113 <!--[if !supportLists]-->一.&l ...

  4. 【转】Java虚拟机的JVM垃圾回收机制

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp43       1.JVM内存空间     JVM堆(Heap)= 新生代 ...

  5. Python Keras module 'keras.backend' has no attribute 'image_data_format'

    问题: 当使用Keras运行示例程序mnist_cnn时,出现如下错误: 'keras.backend' has no attribute 'image_data_format' 程序路径https: ...

  6. Httpservlet 获取json对象字符窜

    使用的是google 的json转换jar import com.google.gson.JsonObject;import com.google.gson.JsonParser; import or ...

  7. webpack配置这一篇就够

    最近看了一篇好文,根据这个文章重新梳理了一遍webpack打包过程,以前的一些问题也都清楚了,在这里分享一下,同时自己也做了一些小的调整 原文链接:http://www.jianshu.com/p/4 ...

  8. 团队作业4----第一次项目冲刺(Alpha版本)4.24

    a.提供当天站立式会议照片 会议内容: ①:对数据库的设计存在问题的进一步讨论 ②:讨论需求分析中的存在的难解决的问题,比如要做到较好的反应用户的行为. ③:分配今天的任务 b. 每个人的工作 工作完 ...

  9. Alpha 版本测试和发布说明

    Alpha版本测试报告 一bug汇总 做题时答案是错的.(已修复) 每次生成的题目一样(已经修复) 计时没有显示即倒计时,难度不同的功能没有实现(打算修复) 没有导入试卷和错题功能(不打算修复) 二. ...

  10. sudoku作业

    1.Github项目地址: https://github.com/ataiyang/ls 2.PSP表格 PSP2.1 Personal Software Process Stages 预估耗时(分钟 ...