HDU 2896 病毒侵袭 AC自动机
2015-12-23 21:11
260 查看
[code]#include<iostream> #include<cstdio> #include<cstring> #include<queue> #include<set> using namespace std; struct ACautomata{ int next[100010][127],idx[100010],fail[100010],last[100010],num,root; int newnode() { memset(next[num],0,sizeof next[num]); idx[num]=0; return num++; } void init() { num=0; root=newnode(); } void insert(char *s,int t) { int len=strlen(s),cur=root; for(int i=0;i<len;++i) { int &tmp=next[cur][s[i]]; if(!tmp)tmp=newnode(); cur=tmp; } idx[cur]=t; } void getfail() { queue<int>q; fail[root]=root; for(int i=0;i<127;++i) { int u=next[root][i]; if(u) { fail[u]=last[u]=0; q.push(u); } } while(!q.empty()) { int cur=q.front(); q.pop(); for(int i=0;i<127;++i) { int u=next[cur][i]; if(u) { fail[u]=next[fail[cur]][i]; last[u]=idx[fail[u]]?fail[u]:last[fail[u]]; q.push(u); } else next[cur][i]=next[fail[cur]][i]; } } } bool query(char *s,int t) { set<int>ret; int len=strlen(s),cur=root; for(int i=0;i<len;++i) { cur=next[cur][s[i]]; int tmp=cur; while(tmp!=root) { if(idx[tmp])ret.insert(idx[tmp]); tmp=last[tmp]; } } if(ret.size()) { printf("web %d:",t); set<int>::iterator iter; for(iter=ret.begin();iter!=ret.end();iter++) printf(" %d",*iter); puts(""); return 1; } else return 0; } }ac; int n,ans; char s[10010]; int main() { ac.init(); scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%s",s); ac.insert(s,i); } ac.getfail(); scanf("%d",&n); for(int i=1;i<=n;++i) { scanf("%s",s); ans+=ac.query(s,i); } printf("total: %d\n",ans); }
思路就是来一个网站就匹配一次。。匹配到一个千万不要break。
记得保存病毒下标,用set方便输出答案。
我这题WA了几次,比如说
tmp=last[tmp];打成了
tmp=fail[tmp]
还有就是charset变成了127而不是26,还要注意格式。
相关文章推荐
- json和jsonp
- curl connection refused 问题
- curl connection refused 问题
- DataGuard---->物理StandBy的角色切换之switchover
- Linux下怎么输入重音符号
- GDAL编译
- AddForce和velocity有什么区别
- 属性声明
- (五)数码管仿真 02
- Linux yum源完全配置
- PAT-统计个位数字(基础函数题)
- Shell
- UFLDL教程答案(7):Exercise:Learning color features with Sparse Autoencoders
- android service 详解
- poj 2253 Frogger【最短路】
- JAVA:Collections类的shuffle()方法
- TCP/IP详解学习笔记
- 选择排序
- IP地址分类
- UICollectionViewCell