[UVA1449] Dominating Patterns(AC自动机,STL,计数,神坑)
题目链接:https://vjudge.net/problem/UVA-1449
题意:给一个词典和一个字符串,找出字符串里出现次数最多的单词,如果有出现次数相同的,要按照输入顺序输出。
坑点好多,或许是因为自己实现得比较挫所以坑才多。
用一个map<string,int>计数,map<string,vector<int>>记录同样的字符串出现的位置,map<string,int> p记录id,string数组记录对应id下的字符串。
查询的时候注意假如字符串中并没有出现词典中的单词,输出0,要按顺序把所有字符串打印出来。
太菜了,这个坑WA了十发。
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 5 typedef pair<int, int> pii; 6 typedef pair<int, string> pis; 7 const int maxn = 155; 8 const int maxm = 1000100; 9 map<string, int> vis; 10 map<string, vector<int>> id; 11 map<string, int> p; 12 string qq[maxn]; 13 int pcnt; 14 15 typedef class Node { 16 public: 17 Node *next[26]; 18 Node *fail; 19 int flag; 20 int id; 21 Node() { 22 memset(next, 0, sizeof(next)); 23 fail = NULL; 24 flag = 0; 25 id = -1; 26 } 27 }Node; 28 29 class AC_Automation { 30 public: 31 Node *root; 32 queue <Node*> q; 33 AC_Automation() { 34 root = new Node(); 35 while(!q.empty()) q.pop(); 36 } 37 void insert(string s) { 38 Node *cur = root; 39 int len = s.length(); 40 for(int i = 0; i < len; i++) { 41 int index = s[i] - 'a'; 42 if(cur->next[index] == NULL) { 43 cur->next[index] = new Node(); 44 } 45 cur = cur->next[index]; 46 } 47 cur->id = p[s]; cur->flag = 1; 48 } 49 void BuildAC() { 50 Node *cur, *tmp; 51 q.push(root); 52 while(!q.empty()) { 53 cur = q.front(); 54 q.pop(); 55 for(int i = 0; i < 26; i++) { 56 if(!cur->next[i]) continue; 57 if(cur == root) { 58 cur->next[i]->fail = root; 59 } 60 else { 61 tmp = cur->fail; 62 while(tmp != NULL) { 63 if(tmp->next[i]) { 64 cur->next[i]->fail = tmp->next[i]; 65 break; 66 } 67 tmp = tmp->fail; 68 } 69 if(tmp == NULL) { 70 cur->next[i]->fail = root; 71 } 72 } 73 q.push(cur->next[i]); 74 } 75 } 76 } 77 void query(string s) { 78 Node *cur = root, *tmp; 79 int len = s.length(); 80 for(int i = 0; i < len; i++) { 81 int index = s[i] - 'a'; 82 while(cur->next[index] == NULL && cur != root) { 83 cur = cur->fail; 84 } 85 cur = cur->next[index]; 86 if(cur == NULL) { 87 cur = root; 88 continue; 89 } 90 tmp = cur; 91 while(tmp != root) { 92 if(tmp->flag) vis[qq[tmp->id]]++; 93 tmp = tmp->fail; 94 } 95 } 96 int maxx = 0; 97 vector<pis> ret; 98 for(auto it : vis) maxx = max(maxx, it.second); 99 for(auto it : vis) { 100 if(it.second == maxx) { 101 for(auto itt : id[it.first]) { 102 ret.push_back(pis(itt, it.first)); 103 } 104 } 105 } 106 sort(ret.begin(), ret.end()); 107 printf("%d\n", maxx); 108 if(maxx != 0) { 109 for(auto it : ret) { 110 printf("%s\n", it.second.c_str()); 111 } 112 } 113 else { 114 for(int i = 0; i < pcnt; i++) { 115 printf("%s\n", qq[i].c_str()); 116 } 117 } 118 } 119 }; 120 121 char pat[maxn], tar[maxm]; 122 int n; 123 124 int main() { 125 // freopen("in", "r", stdin); 126 while(~scanf("%d", &n) && n) { 127 id.clear(); p.clear(); vis.clear(); 128 pcnt = 0; 129 AC_Automation ac = AC_Automation(); 130 for(int i = 1; i <= n; i++) { 131 scanf("%s", pat); 132 if(p.find(pat) == p.end()) { 133 qq[pcnt] = pat; 134 p[pat] = pcnt++; 135 } 136 id[pat].push_back(i); 137 ac.insert(pat); 138 } 139 ac.BuildAC(); 140 scanf("%s", tar); 141 ac.query(tar); 142 } 143 return 0; 144 }
转载于:https://www.cnblogs.com/kirai/p/6777003.html
[UVA1449] Dominating Patterns(AC自动机,STL,计数,神坑)相关推荐
- LA4670 Dominating Patterns[AC自动机]
The archaeologists are going to decipher a very mysterious "language". Now, they know many ...
- bzoj2754JZOJ2834【SCOI2012】喵星球上的点名 AC自动机+STL
题意比较复杂,就不说了. 感觉这题目拿来恶心人的..连输入都要花费好大功夫.表示这种题目经典套路啊,一般来说直接上AC自动机,暴力把大串往小串上贴,然后直接计算答案就行了,但是这数据大小简直了..算了 ...
- AC自动机加强版 uva 1449 - Dominating Patterns
AC自动机最初作用 一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过. 当然这不是AC自动机的全部作用. 本文就是一例,给出几个单词,查询在text里 ...
- 【BZOJ2754】【codevs2403】喵星球上的点名,AC自动机与STL的狂欢
Time:2016.05.17 Author:xiaoyimi 转载注明出处谢谢 传送门1 传送门2 思路: (本来想在学习AC自动机的时候做这个题的,但发现要用vector,所以就弃了) 由于我们要 ...
- LA_4670_Dominating_Patterns_(AC自动机+map)
描述 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...
- 字符串-AC自动机(详细图解)
文章目录 AC自动机 原理 模板 例题 HDU-2222Keywords Search HDU-2896病毒侵袭 HDU-3065病毒侵袭持续中 POJ-2778DNA Sequence HDU-22 ...
- AC自动机算法及模板
AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报 分类: AC自动机(1) 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...
- POJ 3691 DNA repair AC自动机 + DP
题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道 dp[i][j] 为文本串到 第i ...
- CDOJ1633 Video Game Combos [AC自动机+dp]
题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lov ...
- CodeForces - 1252D Find String in a Grid(AC自动机)
题目链接:点击查看 题目大意:给出一个 n * m 的字符矩阵,再给出 q 次询问,每次询问需要回答给出字符串在字符矩阵中出现了多少次,规定在字符矩阵中查找某个字符串,只能先向右 a 个单位,再向下 ...
最新文章
- 全国成人计算机考试题,成人计算机考试试题.docx
- 高级交换路由课程PPT下载打包了
- 2017年实时更新系统hosts文件(不能访问时才会更新)不要用于非法行为 只供内部测试...
- python封装c++_用pybind11封装C++实现的函数库
- java语言编程基础_Java编程基础02——Java语言基础
- 判断当前界面是该fragment_学不动也要学!探究Fragment延迟加载的前世今生
- Springboot分模块开发详解(2):建立子工程
- 【汇编语言】(王爽)实验4解答
- 四旋翼无人机调研结果
- Python与机器视觉(x) 颜色直方图
- 巨人网络辟谣史玉柱被警方带走:下午一直在上海总部开会
- 征途linux mysql_Linux环境——MySQL安装及配置(5.7版本)
- 人人车北京第二家严选店开业 称年内将覆盖一二线城市
- typora快捷键使用
- Android监听系统来电,弹出提示窗口
- CIFAR10图像分类ResNet模型实战(pytorch)
- 芥川龙之介《烟草与魔鬼》
- 2021深圳各中学高考成绩查询,深圳四大高中在2021年高考深一模的前500名分布数据...
- 协同创新 强省惠民 | 山东省数据应用创新创业大赛主赛场等你来战
- 常用的Web前端开发框架有哪些呢?分享这11个
热门文章
- pscc2018安装服务器无响应,一招解决PSCC2018无法安装扩展插件
- vnc repeater linux,远程桌面中转,基于 UltraVNC Repeater(中继器)的远程桌面服务搭建,用于复杂网络环境...
- 【团队管理系列】团队管理方面的量化数据
- python提取图片中的文字
- 获取及计算可滚动元素高度:区分clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop
- Java 发送邮件的几种方式
- matlab两条曲线方程求交点_帮忙matlab求两条曲线交点程序,不知问题出在哪里。...
- Android SDCard
- heading pitch bank
- 原生版本 电信卡HD语音通话记录没有显示为‘外拨的4G高清语音’仅显示为‘外拨的通话’