题目链接: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,计数,神坑)相关推荐

  1. LA4670 Dominating Patterns[AC自动机]

    The archaeologists are going to decipher a very mysterious "language". Now, they know many ...

  2. bzoj2754JZOJ2834【SCOI2012】喵星球上的点名 AC自动机+STL

    题意比较复杂,就不说了. 感觉这题目拿来恶心人的..连输入都要花费好大功夫.表示这种题目经典套路啊,一般来说直接上AC自动机,暴力把大串往小串上贴,然后直接计算答案就行了,但是这数据大小简直了..算了 ...

  3. AC自动机加强版 uva 1449 - Dominating Patterns

    AC自动机最初作用  一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过. 当然这不是AC自动机的全部作用. 本文就是一例,给出几个单词,查询在text里 ...

  4. 【BZOJ2754】【codevs2403】喵星球上的点名,AC自动机与STL的狂欢

    Time:2016.05.17 Author:xiaoyimi 转载注明出处谢谢 传送门1 传送门2 思路: (本来想在学习AC自动机的时候做这个题的,但发现要用vector,所以就弃了) 由于我们要 ...

  5. LA_4670_Dominating_Patterns_(AC自动机+map)

    描述 https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  6. 字符串-AC自动机(详细图解)

    文章目录 AC自动机 原理 模板 例题 HDU-2222Keywords Search HDU-2896病毒侵袭 HDU-3065病毒侵袭持续中 POJ-2778DNA Sequence HDU-22 ...

  7. AC自动机算法及模板

    AC自动机算法及模板 2016-05-08 18:58 226人阅读 评论(0) 收藏 举报  分类: AC自动机(1)  版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 关于 ...

  8. POJ 3691 DNA repair AC自动机 + DP

    题意:给你只包含'A','G','T','C'四个字母的n个模板串和1个文本串,问你文本串改变多少个字符就可以使得文本串中没有一个模板串 解题思路: 我们可以知道  dp[i][j] 为文本串到 第i ...

  9. CDOJ1633 Video Game Combos [AC自动机+dp]

    题目地址:http://acm.uestc.edu.cn/problem.php?pid=1633 AC自动机+BFS AC自动机,参见:http://www.cnblogs.com/luna-lov ...

  10. CodeForces - 1252D Find String in a Grid(AC自动机)

    题目链接:点击查看 题目大意:给出一个 n * m 的字符矩阵,再给出 q 次询问,每次询问需要回答给出字符串在字符矩阵中出现了多少次,规定在字符矩阵中查找某个字符串,只能先向右 a 个单位,再向下 ...

最新文章

  1. 全国成人计算机考试题,成人计算机考试试题.docx
  2. 高级交换路由课程PPT下载打包了
  3. 2017年实时更新系统hosts文件(不能访问时才会更新)不要用于非法行为 只供内部测试...
  4. python封装c++_用pybind11封装C++实现的函数库
  5. java语言编程基础_Java编程基础02——Java语言基础
  6. 判断当前界面是该fragment_学不动也要学!探究Fragment延迟加载的前世今生
  7. Springboot分模块开发详解(2):建立子工程
  8. 【汇编语言】(王爽)实验4解答
  9. 四旋翼无人机调研结果
  10. Python与机器视觉(x) 颜色直方图
  11. 巨人网络辟谣史玉柱被警方带走:下午一直在上海总部开会
  12. 征途linux mysql_Linux环境——MySQL安装及配置(5.7版本)
  13. 人人车北京第二家严选店开业 称年内将覆盖一二线城市
  14. typora快捷键使用
  15. Android监听系统来电,弹出提示窗口
  16. CIFAR10图像分类ResNet模型实战(pytorch)
  17. 芥川龙之介《烟草与魔鬼》
  18. 2021深圳各中学高考成绩查询,深圳四大高中在2021年高考深一模的前500名分布数据...
  19. 协同创新 强省惠民 | 山东省数据应用创新创业大赛主赛场等你来战
  20. 常用的Web前端开发框架有哪些呢?分享这11个

热门文章

  1. pscc2018安装服务器无响应,一招解决PSCC2018无法安装扩展插件
  2. vnc repeater linux,远程桌面中转,基于 UltraVNC Repeater(中继器)的远程桌面服务搭建,用于复杂网络环境...
  3. 【团队管理系列】团队管理方面的量化数据
  4. python提取图片中的文字
  5. 获取及计算可滚动元素高度:区分clientHeight、offsetHeight、scrollHeight、offsetTop、scrollTop
  6. Java 发送邮件的几种方式
  7. matlab两条曲线方程求交点_帮忙matlab求两条曲线交点程序,不知问题出在哪里。...
  8. Android SDCard
  9. heading pitch bank
  10. 原生版本 电信卡HD语音通话记录没有显示为‘外拨的4G高清语音’仅显示为‘外拨的通话’