数单词

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语。
LYH本来以为自己在6月份的考试中可以通过六级,可是没想到,成绩出来以后,居然没有通过。所以他不得不付出更多的时间来学习英语。
要想通过六级,最基本的要求就是词汇量。为了能够更快的记住一些陌生单词,LYH有时会找一些英语文章来读。
今天早上,LYH又找了一篇文章。读之前,他突然萌生出一个想法:文章中哪些单词出现的次数最多呢?
输入
第一行输入一个整数T,表示有T组测试数据(1≤T≤200)。
对于每组测试数据,第一行输入一个整数n(1≤n≤150),表示LYH要查询的单词数量(有些单词可能会重复出现)。
接下来n行,每行输入一个单词,长度不大于100。
最后一行包含一个由小写字母组成的英语文章(字符串),长度不大于10^6。
输出
对于每组数据,第一行输出一个整数,表示单词出现的次数。
然后按照输入顺序,每行输出一个出现次数最多的单词。如果有重复出现的单词,把它们全部输出。
样例输入
2
3
good
oo
one
goodafternooneveryone
1
to
welcometotopcoder
样例输出
2
oo
one
2
to

分析:这就是一个AC自动机模板题,要注意的是查询的单词中,一个单词可能会出现多次,这里要处理一下。

[cpp] view plaincopy
  1. #include <cstring>
  2. #include <cstdio>
  3. #include <algorithm>
  4. #include <map>
  5. #include <string>
  6. #include <queue>
  7. using namespace std;
  8. #define SIGMA_SIZE 26 //文本串字符内容
  9. #define MAXNODE 20000 //节点数量
  10. #define TEXT_SIZE 1000005 //文本串长度
  11. #define P_SIZE 100 //模式串长度
  12. #define P_NUM 200 //模式串数量
  13. map <string, int> mp;
  14. struct AhoCorasickAutomata
  15. {
  16. int cnt[P_NUM];
  17. int sz;
  18. int ch[MAXNODE][SIGMA_SIZE];
  19. int f[MAXNODE];
  20. int val[MAXNODE];
  21. int last[MAXNODE];
  22. void Init() {
  23. sz = 1;
  24. memset(ch[0],0,sizeof(ch[0]));
  25. memset(cnt,0,sizeof(cnt));
  26. mp.clear();
  27. }
  28. int idx(char c) {
  29. return c - 'a';
  30. }
  31. void Insert(char *s,int v) {
  32. int u = 0, n = strlen(s);
  33. for(int i = 0; i < n; i++) {
  34. int c = idx(s[i]);
  35. if(!ch[u][c]) {
  36. memset(ch[sz], 0, sizeof(ch[sz]));
  37. val[sz] = 0;
  38. ch[u][c] = sz++;
  39. }
  40. u = ch[u][c];
  41. }
  42. val[u] = v;
  43. mp[string(s)] = v;
  44. }
  45. void print(int j) {
  46. if(j) {
  47. cnt[val[j]]++;
  48. print(last[j]);
  49. }
  50. }
  51. void Find(char *T) {
  52. int n = strlen(T);
  53. int j = 0;
  54. for(int i = 0; i < n; i++) {
  55. int c = idx(T[i]);
  56. while(j && !ch[j][c]) j = f[j];
  57. j = ch[j][c];
  58. if(val[j]) print(j);
  59. else if(last[j]) print(last[j]);
  60. }
  61. }
  62. void Get_Fail() {
  63. queue<int> q;
  64. f[0] = 0;
  65. for(int c = 0; c<SIGMA_SIZE; c++) {
  66. int u = ch[0][c];
  67. if(u) {
  68. f[u] = 0;
  69. q.push(u);
  70. last[u] = 0;
  71. }
  72. }
  73. while(!q.empty()) {
  74. int r = q.front();
  75. q.pop();
  76. for(int c = 0; c<SIGMA_SIZE; c++) {
  77. int u = ch[r][c];
  78. if(!u) continue;
  79. q.push(u);
  80. int v = f[r];
  81. while(v && !ch[v][c]) v = f[v];
  82. f[u] = ch[v][c];
  83. last[u] = val[f[u]] ? f[u] : last[f[u]];
  84. }
  85. }
  86. }
  87. };
  88. char text[TEXT_SIZE];
  89. char P[P_NUM][P_SIZE];
  90. AhoCorasickAutomata ac;
  91. int n, T;
  92. int main() {
  93. scanf("%d", &T);
  94. int cas = 0;
  95. while(T--) {
  96. scanf("%d", &n);
  97. ac.Init();
  98. for(int i = 1; i <= n; i++) {
  99. scanf("%s", P[i]);
  100. ac.Insert(P[i], i);
  101. }
  102. ac.Get_Fail();
  103. scanf("%s", text);
  104. ac.Find(text);
  105. int Max_cnt = -1;
  106. for(int i = 1; i <= n; i++)
  107. if(ac.cnt[i] > Max_cnt)
  108. Max_cnt = ac.cnt[i];
  109. printf("%d\n", Max_cnt);
  110. for(int i = 1; i <= n; i++)
  111. if(ac.cnt[mp[string(P[i])]] == Max_cnt)
  112. printf("%s\n", P[i]);
  113. }
  114. return 0;
  115. }

数单词 (AC自动机模板题)相关推荐

  1. NYOJ 1085 数单词 (AC自动机模板题)

    数单词 时间限制:1000 ms  |  内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...

  2. [Bzoj3940] [AC自动机,USACO 2015 February Gold] Censor [AC自动机模板题]

    AC自动机模板题(膜jcvb代码) 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> ...

  3. HDU 2222 Keywords Search (AC自动机模板题)

    一组数据: 1 3 sss sss sss sss ans:3 #include <cstdio> #include <cstdlib> #include <vector ...

  4. 关键词匹配(Ac自动机模板题)

    2772: 关键词匹配 Time Limit: 1 Sec  Memory Limit: 128 MB Submit: 10  Solved: 4 [Submit][Status][Web Board ...

  5. HDU 2896 病毒侵袭(AC自动机/模板题)

    传送门 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others)            Memory Limit: 131072/131072 K (Java/Other ...

  6. Keywords Search HDU - 2222(AC自动机模板)

    题意: 给定 n个长度不超过 50的由小写英文字母组成的单词准备查询,以及一篇文章,问:文中出现了多少个待查询的单词.多组数据. 题目: In the modern time, Search engi ...

  7. AC自动机模板(【洛谷3808】)

    题面 题目背景 这是一道简单的AC自动机模版题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 题目描述 给定n个模式串和1个文本串,求有多少个模式串 ...

  8. 牛客小白月赛12 J 月月查华华的手机 (序列自动机模板题)

    链接:https://ac.nowcoder.com/acm/contest/392/J 来源:牛客网 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机.月月出于人类最单纯的好奇 ...

  9. 【BZOJ3530】数数(AC自动机,动态规划)

    [BZOJ3530]数数(AC自动机,动态规划) 题面 BZOJ 题解 很套路的\(AC\)自动机+\(DP\) 首先,如果长度小于\(N\) 就不存在任何限制 直接大力\(DP\) 然后强制限制不能 ...

最新文章

  1. 如何对 Rocksdb以及类似存储引擎社区 提出 有效的性能问题?
  2. 联机分析处理系统与联机事务处理系统的区别和联系_混合事务分析处理“HTAP”的技术要点分析...
  3. 关于Hinton团队无监督新作SimCLR的所思所想
  4. eclipse IDE中無法打開android模擬器
  5. 使用BusyBox制作根文件系统的操作步骤
  6. 重磅 | 第八届世界华人数学家大会将在清华大学举行
  7. anuglar.js ui-router传递参数
  8. delphi微信授权登陆
  9. java突然无法加载主类_java错误:找不到或无法加载主类的原因与解决方法
  10. python数字转换英文26字母_用python实现英文字母和相应序数转换的方法
  11. Elasticsearch 地理位置查询
  12. 360浏览器登录新浪微博图标显示为字母及占用CPU过高问题的解决
  13. 关于Bilibili下载问题
  14. 连续复利怎么用计算机算,请问银行的连续复利计算公式
  15. 分享106个PHP源码,总有一款适合您
  16. 使用CIFAR10数据集完成知识蒸馏(参照了快乐就好_Peng博主的博客)致谢
  17. ls一1测距仪说明书_生产力小工具 篇一:激光测距靠谱吗?杜克LS-1激光测距仪开箱测评...
  18. java 属性签名_java – 使用BouncyCastle将签名/身份验证的属性添加到CMS签名
  19. 将16进制string转成16进制stream
  20. vue el-table 滚动条样式设置(谷歌、火狐)

热门文章

  1. 【Java 并发编程】线程锁机制 ( 悲观锁 | 乐观锁 | CAS 三大问题 | ABA 问题 | 循环时间长问题 | 多个共享变量原子性问题 )
  2. 数据库时间内接受的是lang类型的时间 分为三种字段 第一种只存日期 第二种存日期+时间 第三种时间戳...
  3. P1525 关押罪犯
  4. Django ORM 级联删除
  5. 写给java开发的运维笔记
  6. codevs 1183 泥泞的道路 二分+SPFA最长路
  7. ma应用、超级短线、分钟短线买卖和看盘心得
  8. 极致真实感受 无边硬屏即将登场
  9. 动态行和列的表格,展现方式
  10. Oracle RMAN中备份表空间名为'TEST'时需要注意的问题