病毒侵袭(ac自动机模板)
2015-09-25 17:44
323 查看
#include <iostream> #include <cstdio> #include <cstring> #include <queue> using namespace std; const int sigma_size = 128; const int maxnode = 500005; int cnt[550],n,m,st; struct Trie{ int ch[maxnode][sigma_size]; int val[maxnode]; int f[maxnode]; int root,L; int newnode(){ for(int i = 0;i < sigma_size;i++){ ch[L][i] = -1; } val[L++] = -1; return L - 1; } void init() { L = 0; root = newnode(); } int idx(char x){ return x - ' '; } void Insert(char *s,int v){ int len = strlen(s); int now = root; for(int i = 0;i < len;i++){ int c = idx(s[i]); if(ch[now][c] == -1){ ch[now][c] = newnode(); } now = ch[now][c]; } val[now] = v; } void getFail(){ queue<int> q; f[root] = root; for(int i = 0;i < sigma_size;i++){ if(ch[root][i] == -1){ ch[root][i] = root; } else { f[ch[root][i]] = root; q.push(ch[root][i]); } } while(!q.empty()){ int now = q.front();q.pop(); for(int i = 0;i < sigma_size;i++){ if(ch[now][i] == -1){ ch[now][i] = ch[f[now]][i]; } else { f[ch[now][i]] = ch[f[now]][i]; q.push(ch[now][i]); } } } } void Find(char *s){ int len = strlen(s); int now = root; for(int i = 0;i < len;i++){ int c = idx(s[i]); now = ch[now][c]; int tmp = now; while(tmp != root){ if(val[tmp] != -1){ cnt[val[tmp]] = 1; //val[tmp] = 0; } tmp = f[tmp]; } } } }; Trie ac; char buf[10050]; int main() { while(scanf("%d",&n)!=EOF){ ac.init(); for(int i = 1;i <= n;i++){ scanf("%s",buf); ac.Insert(buf,i); } ac.getFail(); scanf("%d",&m); int sum = 0; memset(cnt,0,sizeof(cnt)); // cout<<cnt[0]<<"#"<<endl; for(int i = 1;i <= m;i++){ scanf("%s",buf); int flag = 0; ac.Find(buf); // cout<<cnt[0]<<"#"<<endl; for(int j = 0;j <= n;j++){ if(cnt[j] == 1){ if(!flag) { printf("web %d:",i); flag = 1; sum ++; } cnt[j] = 0; printf(" %d",j); } } if(flag) printf("\n"); //cout<<cnt[0]<<"#"<<endl; } printf("total: %d\n",sum); } return 0; }
相关文章推荐
- 大型Web应用的数据库设计与部署
- Jfire-Orm迎来第一个功能更新
- (法)H.嘉当(H.Cartan)、塞尔(J.P.Serre)、施瓦茨(L.Schwartz)等[著],刘应明、胡师度[译]:代数结构与拓扑结构
- Codeforces 405C Unusual Product
- Java核心技术第3章(1)
- Android瀑布流照片墙实现,体验不规则排列的美感
- OpenCV2学习笔记(十四):基于OpenCV卡通图片处理
- hdu2222
- JAVA—实现异步两种方式
- 打堆栈的方式
- objenesis的实现与性能测试
- K-Core算法
- Android动画之translate(位移动画)
- 手把手教你开发Chrome扩展
- InstallShield制作的软件问题
- 随记--更新于20150925
- php Hash Table(四) Hash Table添加和更新元素
- -webkit-,-moz-,-ms-,-o-
- IOS HTTP同步异步
- linux常用命令