HDU 2896 病毒侵袭(AC自动机)
2015-11-07 00:03
441 查看
分析:这也是一道很裸的AC自动机,单词结尾的节点不在是1,而是id,即这个单词的序号,然后用vector把所有序号存在来,一遍去重,然后输出答案就好了。
总的复杂度为o(m*l)
代码:
总的复杂度为o(m*l)
代码:
#include <bits/stdc++.h> #define LL long long #define uLL long long #define FOR(i,x,y) for(int i = x;i < y;++ i) #define IFOR(i,x,y) for(int i = x;i > y;-- i) using namespace std; typedef vector <int> VT; const int maxn = 550*220; const int maxm = 10010; struct Trie{ int ch[maxn][128],en[maxn],fail[maxn]; int rt,sz; void init(){ rt = sz = 0; memset(ch[rt],-1,sizeof(ch[rt])); } void newnode(){ ++ sz; memset(ch[sz],-1,sizeof(ch[sz])); en[sz] = 0; } void insert(char* str,int val){ int len = strlen(str); int u = rt; FOR(i,0,len){ if(ch[u][str[i]-' '] == -1){ newnode(); ch[u][str[i]-' '] = sz; } u = ch[u][str[i]-' ']; } en[sz] = val; } void build(){ queue <int> q; FOR(i,0,128){ if(ch[rt][i] == -1){ ch[rt][i] = rt; } else{ fail[ch[rt][i]] = rt; q.push(ch[rt][i]); } } while(!q.empty()){ int u = q.front(); q.pop(); FOR(i,0,128){ if(ch[u][i] == -1){ ch[u][i] = ch[fail[u]][i]; } else{ fail[ch[u][i]] = ch[fail[u]][i]; q.push(ch[u][i]); } } } } VT query(char* str){ int len = strlen(str); int now = rt; VT res; FOR(i,0,len){ now = ch[now][str[i]-' ']; int temp = now; while(temp != rt){ if(en[temp]){ res.push_back(en[temp]); } temp = fail[temp]; } } return res; } }ac; int n,m; char s[maxm]; int main() { //freopen("test.in","r",stdin); while(~scanf("%d",&n)){ ac.init(); FOR(i,1,n+1){ scanf("%s",s); ac.insert(s,i); } ac.build(); scanf("%d",&m); int id = 0; FOR(i,1,m+1){ scanf("%s",s); VT ans = ac.query(s); if(ans.size()){ ++id; printf("web %d:",i); sort(ans.begin(),ans.end()); VT :: iterator it = unique(ans.begin(),ans.end()); ans.erase(it,ans.end()); FOR(i,0,(int)ans.size()){ printf(" %d",ans[i]); } printf("\n"); } } printf("total: %d\n",id); } return 0; }
相关文章推荐
- Codeforces Round #328 (Div. 2)C. The Big Race
- Spring记录 - Jackson使用上的注意点Boolean字段
- .net生成验证码
- asp.net fileupload控件上传图片并预览图片
- 深入学习.net验证码生成及使用方法
- 使用Python导出Excel图表以及到处为图片的方法
- 举例讲解Linux系统下Python调用系统Shell的方法
- Python的Flask框架中SQLAlchemy使用时的乱码问题解决
- 用Python的Flask框架结合MySQL些一个内存监控程序
- php实现点击可刷新验证码
- 详解PHP数组赋值方法
- jQuery插件开发精品教程(让你的jQuery更上一个台阶)
- jquery判断当前浏览器的实现代码
- jquery验证邮箱格式并显示提交按钮
- jquery UI Datepicker时间控件的使用方法(基础版)
- jquery UI Datepicker时间控件的使用方法(加强版)
- jquery UI Datepicker时间控件的使用方法(终结版)
- 为什么软件外包开发不再可行
- 当程序员的技巧:你的努力和勤奋一定要让别人看的见
- 35 个 Java 代码性能优化总结