UVA 1449 Dominating Patterns(AC自动机)

http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=36265

题意:

给你n个单词,还有一个长文本s,现在要你输出在文本s中出现次数最多的单词。

分析:

直接建立AC自动机,并且val值是当前插入单词的编号。建立AC自动机后,用s文本串去匹配,每当走过val非0的节点后都使得对应单词的cnt值+1.最后一遍扫描cnt数组,然后求出max值。然后在扫描一遍输入单词,只要当前单词的cnt值==max就输出当前单词。

注意:这里有个问题。如果输入单词有重复的情况如:

单词aaa输入了两遍的话,那么在建立Trie的时候后来的aaa覆盖了前一个aaa,最终算得cnt[i]=0,cnt[i+1]=5。结果我们就只输出了一个aaa。其实我们应该输出两次aaa(在最终结果里)。这里我们应该做个map映射,将字符串=="aaa"的所有单词始终映射到序号x上,最终cnt[x]的值=5=max,最后我们扫描一遍单词aaa,用过map[aaa]来获得aaa的序号为x,这样就可以输出2遍aaa了。

AC代码:

#include<cstdio>
#include<queue>
#include<cstring>
#include<map>
#include<string>
#include<iostream>using namespace std;
const int maxnode=11000;
const int sigma_size=26;
map<string,int >ms;struct AC_Automata
{int ch[maxnode][sigma_size];int val[maxnode];int f[maxnode];int last[maxnode];int sz;int cnt[200];//计算字符串出现的次数void init(){sz=1;memset(ch[0],0,sizeof ch[0]);memset(cnt,0,sizeof cnt);ms.clear();}void insert(char *s,int v)//v是单词s输入的序号{int n=strlen(s),u=0;for(int i=0;i<n;i++){int id=s[i]-'a';if(ch[u][id]==0){ch[u][id]=sz;memset(ch[sz],0,sizeof ch[sz]);val[sz++]=0;}u=ch[u][id];}val[u]=v;ms[string(s)]=v;}void print(int i){if(val[i]){cnt[val[i]]++;print(last[i]);}}void find(char *s){int n=strlen(s);int j=0;for(int i=0;i<n;i++){int id=s[i]-'a';while(j&&ch[j][id]==0)j=f[j];j=ch[j][id];if(val[j])print(j);else if(val[last[j]])print(last[j]);}}void getfail(){queue<int >q;last[0]=f[0]=0;for(int i=0;i<sigma_size;i++){int u=ch[0][i];if(u){f[u]=last[u]=0;q.push(u);}}while(!q.empty()){int r=q.front();q.pop();for(int i=0;i<sigma_size;i++){int u=ch[r][i];if(!u)continue;q.push(u);int v=f[r];while(v&&ch[v][i]==0)v=f[v];f[u]=ch[v][i];last[u]=val[f[u]]?f[u]:last[f[u]];}}}
}ac;
char word[160][80];
char text[1000000+1000];
int main()
{int n;while(~scanf("%d",&n)&&n){ac.init();for(int i=1;i<=n;i++){scanf("%s",word[i]);ac.insert(word[i],i);}//cout<<"+++"<<endl;ac.getfail();scanf("%s",text);ac.find(text);int maxe=-1;for(int i=1;i<=n;i++){if(ac.cnt[i]>maxe)maxe=ac.cnt[i];}printf("%d\n",maxe);for(int i=1;i<=n;i++){if(ac.cnt[ms[string(word[i])]]==maxe)printf("%s\n",word[i]);}}
}

UVA 1449 Dominating Patterns(AC自动机)相关推荐

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

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

  2. LA4670 Dominating Patterns[AC自动机]

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

  3. UVA 11468 Substring(AC自动机+dp)

    题意就是给你几个模板串,以及一些字符的出现概率,随机选择字符L次后得到一个长度为L的字符串,问这个字符串不包括任何一个模板串的概率. 比较简单的题,把模板串构建成AC自动机,随机选择字符相当于在字典树 ...

  4. UVa 11468 (AC自动机 概率DP) Substring

    将K个模板串构成一个AC自动机,那些能匹配到的单词节点都称之为禁止节点. 然后问题就变成了在Tire树上走L步且不经过禁止节点的概率. 根据全概率公式用记忆化搜索求解. 1 #include < ...

  5. AC自动机——Uva 11468 子串

    题目链接:http://vjudge.net/contest/142513#problem/A 题意:给出一些字符和各自对应的选择概率,随机选择L次后将得到一个长度为L的随机字符串S.给出K个模版串, ...

  6. LA_4670_Dominating_Patterns_(AC自动机+map)

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

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

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

  8. KMP算法、AC自动机算法的原理介绍以及Python实现

    KMP算法 要弄懂AC自动机算法,首先弄清楚KMP算法. 这篇文章讲的很好: http://www.ruanyifeng.com/blog/2013/05/Knuth%E2%80%93Morris%E ...

  9. hihocoder第218周:AC自动机

    题目链接 问题描述 给定n个单词,给定一个长字符串s,单词总长度和字符串s的长度都不超过1e5.要求把s中所有的出现单词的位置用*替代. 例如: 样例输入 2 abc cd abcxyzabcd 样例 ...

  10. 2018北京ICPC H. Approximate Matching(AC自动机+DP)

    H : Approximate Matching 时间限制:1000ms,单点时限:1000ms,内存限制:512MB 描述 String matching, a common problem in ...

最新文章

  1. WCF技术剖析之二十五: 元数据(Metadata)架构体系全景展现[WS标准篇]
  2. Xcode6的 实时渲染 在storyboard修改自定义属性
  3. Entity Framework 4 in Action读书笔记——第一章:数据访问重载:Entity Framework(2)...
  4. 笔记本电脑怎么清理灰尘_手机声音越用越小怎么办?一段黑科技音波就能清理扬声器灰尘...
  5. websocket的用途/场景
  6. 带你一起学软件工程的专业英语!(IT行业、四六级党快记起来)《软件工程专业英语》第一单元:启动软件项目——单词、短语、名词缩写、难句、备忘录的基本格式样本(必备技能)
  7. java的位置_Java中数据存放的位置
  8. Java讲课笔记14:final关键字
  9. 计算机二级考试操作题outlook,2017年计算机考试二级考试操作题.doc
  10. inotify监控文件变化
  11. Atitit 通用服务端代理接口 转接口 attilax总结
  12. 深入浅出Python——Python高级语法之文件操作
  13. 【数据分享】中国城市统计年鉴_2001-2021年
  14. html怎么调用js,HTML内怎么调用JS函数?
  15. Word 2016插入公式快捷键
  16. 吕 思 伟 ---- 潘 爱 民 :: ATL 介 绍( 一)
  17. 泼冷水!为什么说机器学习在很多方面被高估了? | 精选
  18. iOS开发之模仿qq通讯录
  19. Java基础学习01(JDK)
  20. stinger 小型机器人_具备人脸识别的杀人蜂小型机器人

热门文章

  1. SQL手工注入笔记1
  2. SeaWeedfs 分布式网络文件存储介绍
  3. 射频开关:SPDT、级联、树形和矩阵开关
  4. 进不去jetbrain官网怎么办
  5. jqwidgets splitter把页面水平分割
  6. 如何设置计算机桌面待办事项,电脑上怎么设置重要事情提醒?怎么在电脑桌面便签上设置重要事项提醒...
  7. 快速实现微信公众号支付功能
  8. linux配置web页面登录密码,在Linux下通过WEB认证方式上网
  9. 从攻击事件分析加密攻击类型、工具、防范方法和未来预测
  10. 移动硬盘linux双系统,在移动硬盘安装Linux(Ubuntu)双系统