数单词 (AC自动机模板题)
数单词
- 描述
-
为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语。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- #include <cstring>
- #include <cstdio>
- #include <algorithm>
- #include <map>
- #include <string>
- #include <queue>
- using namespace std;
- #define SIGMA_SIZE 26 //文本串字符内容
- #define MAXNODE 20000 //节点数量
- #define TEXT_SIZE 1000005 //文本串长度
- #define P_SIZE 100 //模式串长度
- #define P_NUM 200 //模式串数量
- map <string, int> mp;
- struct AhoCorasickAutomata
- {
- int cnt[P_NUM];
- int sz;
- int ch[MAXNODE][SIGMA_SIZE];
- int f[MAXNODE];
- int val[MAXNODE];
- int last[MAXNODE];
- void Init() {
- sz = 1;
- memset(ch[0],0,sizeof(ch[0]));
- memset(cnt,0,sizeof(cnt));
- mp.clear();
- }
- int idx(char c) {
- return c - 'a';
- }
- void Insert(char *s,int v) {
- int u = 0, n = strlen(s);
- for(int i = 0; i < n; i++) {
- int c = idx(s[i]);
- if(!ch[u][c]) {
- memset(ch[sz], 0, sizeof(ch[sz]));
- val[sz] = 0;
- ch[u][c] = sz++;
- }
- u = ch[u][c];
- }
- val[u] = v;
- mp[string(s)] = v;
- }
- void print(int j) {
- if(j) {
- cnt[val[j]]++;
- print(last[j]);
- }
- }
- void Find(char *T) {
- int n = strlen(T);
- int j = 0;
- for(int i = 0; i < n; i++) {
- int c = idx(T[i]);
- while(j && !ch[j][c]) j = f[j];
- j = ch[j][c];
- if(val[j]) print(j);
- else if(last[j]) print(last[j]);
- }
- }
- void Get_Fail() {
- queue<int> q;
- f[0] = 0;
- for(int c = 0; c<SIGMA_SIZE; 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<SIGMA_SIZE; 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]];
- }
- }
- }
- };
- char text[TEXT_SIZE];
- char P[P_NUM][P_SIZE];
- AhoCorasickAutomata ac;
- int n, T;
- int main() {
- scanf("%d", &T);
- int cas = 0;
- while(T--) {
- scanf("%d", &n);
- ac.Init();
- for(int i = 1; i <= n; i++) {
- scanf("%s", P[i]);
- ac.Insert(P[i], i);
- }
- ac.Get_Fail();
- scanf("%s", text);
- ac.Find(text);
- int Max_cnt = -1;
- for(int i = 1; i <= n; i++)
- if(ac.cnt[i] > Max_cnt)
- Max_cnt = ac.cnt[i];
- printf("%d\n", Max_cnt);
- for(int i = 1; i <= n; i++)
- if(ac.cnt[mp[string(P[i])]] == Max_cnt)
- printf("%s\n", P[i]);
- }
- return 0;
- }
数单词 (AC自动机模板题)相关推荐
- NYOJ 1085 数单词 (AC自动机模板题)
数单词 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 为了能够顺利通过英语四六级考试,现在大家每天早上都会早起读英语. LYH本来以为自己在6月份的考试中可以通过六级, ...
- [Bzoj3940] [AC自动机,USACO 2015 February Gold] Censor [AC自动机模板题]
AC自动机模板题(膜jcvb代码) 1 #include <iostream> 2 #include <algorithm> 3 #include <cstdio> ...
- HDU 2222 Keywords Search (AC自动机模板题)
一组数据: 1 3 sss sss sss sss ans:3 #include <cstdio> #include <cstdlib> #include <vector ...
- 关键词匹配(Ac自动机模板题)
2772: 关键词匹配 Time Limit: 1 Sec Memory Limit: 128 MB Submit: 10 Solved: 4 [Submit][Status][Web Board ...
- HDU 2896 病毒侵袭(AC自动机/模板题)
传送门 病毒侵袭 Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 131072/131072 K (Java/Other ...
- Keywords Search HDU - 2222(AC自动机模板)
题意: 给定 n个长度不超过 50的由小写英文字母组成的单词准备查询,以及一篇文章,问:文中出现了多少个待查询的单词.多组数据. 题目: In the modern time, Search engi ...
- AC自动机模板(【洛谷3808】)
题面 题目背景 这是一道简单的AC自动机模版题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据,请不要恶意提交. 题目描述 给定n个模式串和1个文本串,求有多少个模式串 ...
- 牛客小白月赛12 J 月月查华华的手机 (序列自动机模板题)
链接:https://ac.nowcoder.com/acm/contest/392/J 来源:牛客网 题目描述 月月和华华一起去吃饭了.期间华华有事出去了一会儿,没有带手机.月月出于人类最单纯的好奇 ...
- 【BZOJ3530】数数(AC自动机,动态规划)
[BZOJ3530]数数(AC自动机,动态规划) 题面 BZOJ 题解 很套路的\(AC\)自动机+\(DP\) 首先,如果长度小于\(N\) 就不存在任何限制 直接大力\(DP\) 然后强制限制不能 ...
最新文章
- 如何对 Rocksdb以及类似存储引擎社区 提出 有效的性能问题?
- 联机分析处理系统与联机事务处理系统的区别和联系_混合事务分析处理“HTAP”的技术要点分析...
- 关于Hinton团队无监督新作SimCLR的所思所想
- eclipse IDE中無法打開android模擬器
- 使用BusyBox制作根文件系统的操作步骤
- 重磅 | 第八届世界华人数学家大会将在清华大学举行
- anuglar.js ui-router传递参数
- delphi微信授权登陆
- java突然无法加载主类_java错误:找不到或无法加载主类的原因与解决方法
- python数字转换英文26字母_用python实现英文字母和相应序数转换的方法
- Elasticsearch 地理位置查询
- 360浏览器登录新浪微博图标显示为字母及占用CPU过高问题的解决
- 关于Bilibili下载问题
- 连续复利怎么用计算机算,请问银行的连续复利计算公式
- 分享106个PHP源码,总有一款适合您
- 使用CIFAR10数据集完成知识蒸馏(参照了快乐就好_Peng博主的博客)致谢
- ls一1测距仪说明书_生产力小工具 篇一:激光测距靠谱吗?杜克LS-1激光测距仪开箱测评...
- java 属性签名_java – 使用BouncyCastle将签名/身份验证的属性添加到CMS签名
- 将16进制string转成16进制stream
- vue el-table 滚动条样式设置(谷歌、火狐)
热门文章
- 【Java 并发编程】线程锁机制 ( 悲观锁 | 乐观锁 | CAS 三大问题 | ABA 问题 | 循环时间长问题 | 多个共享变量原子性问题 )
- 数据库时间内接受的是lang类型的时间 分为三种字段 第一种只存日期 第二种存日期+时间 第三种时间戳...
- P1525 关押罪犯
- Django ORM 级联删除
- 写给java开发的运维笔记
- codevs 1183 泥泞的道路 二分+SPFA最长路
- ma应用、超级短线、分钟短线买卖和看盘心得
- 极致真实感受 无边硬屏即将登场
- 动态行和列的表格,展现方式
- Oracle RMAN中备份表空间名为'TEST'时需要注意的问题