【LA4670-Dominating Patterns】AC自动机
2016-07-19 21:55
302 查看
http://acm.hust.edu.cn/vjudge/problem/19224
题意:给定n个单词,一个字符串,问哪些单词在字符串中出现的次数最多。单词aba,文本ababa,则aba出现了2次。
题解:每找到一个记得要顺着fail找到所有单词。
题意:给定n个单词,一个字符串,问哪些单词在字符串中出现的次数最多。单词aba,文本ababa,则aba出现了2次。
题解:每找到一个记得要顺着fail找到所有单词。
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<queue> using namespace std; const int N=160,L=1000010; char s[L],ss [110]; int cnt ; int num,mx,n; struct node{ int son[30]; int id,fail; }a[N*110]; queue<int> q; int maxx(int x,int y){return x>y ? x:y;} void clear(int x) { a[x].id=a[x].fail=0; memset(a[x].son,0,sizeof(a[x].son)); } void trie(char *c,int id) { int l=strlen(c); int x=0; for(int i=0;i<l;i++) { int t=c[i]-'a'+1; if(!a[x].son[t]) { num++; clear(num); a[x].son[t]=num; } x=a[x].son[t]; } a[x].id=id; } void buildAC() { while(!q.empty()) q.pop(); for(int i=1;i<=26;i++) if(a[0].son[i]) q.push(a[0].son[i]); while(!q.empty()) { int x=q.front();q.pop(); int fail=a[x].fail; for(int i=1;i<=26;i++) { int y=a[x].son[i]; if(y) { a[y].fail=a[fail].son[i]; q.push(y); } else a[x].son[i]=a[fail].son[i]; } } } void find(char *c) { int l=strlen(c); int x=0; for(int i=0;i<l;i++) { int t=c[i]-'a'+1; if(!a[x].son[t]) x=0; else x=a[x].son[t]; int p=x; while(p) { if(a[p].id) cnt[a[p].id]++; p=a[p].fail; } } } int main() { freopen("a.in","r",stdin); freopen("a.out","w",stdout); while(1) { scanf("%d",&n); if(!n) return 0; num=mx=0; clear(0); memset(cnt,0,sizeof(cnt)); for(int i=1;i<=n;i++) { scanf("%s",ss[i]); trie(ss[i],i); } buildAC(); scanf("%s",s); find(s); for(int i=1;i<=n;i++) mx=maxx(mx,cnt[i]); printf("%d\n",mx); for(int i=1;i<=n;i++) { if(mx==cnt[i]) printf("%s\n",ss[i]); } } return 0; }
相关文章推荐
- XML的解析和保存
- 类的有参方法
- 《OpenCV2计算机视觉编程手册》2-5
- 求有环单链表的环长
- Julia: 如何转换PyPlot的X轴的日期格式?
- 心情无迹的博客
- JavaScript基础(一)
- WebService学习总结十一 使用Ajax访问WebService和使用HttpURLConnection访问WebService
- JS模板引擎---mustache与HandleBars
- 亦大自学51cto--cisco网络设备命令
- laravel 怎么部署到万网的虚拟主机上?
- [101] Symmetric Tree
- Intent 之系统Intent<一>
- 菜鸟学Android源码——Setting(1)
- WebDev.WebServer40 调试vs代码
- Caffe源码:io.cpp 分析
- 容易已发bug环节总结
- bwlabel.cpp
- JVM垃圾回收总结
- Jenkins+postman+newman之API全自动化测试