您的位置:首页 > 其它

hdu2896 病毒侵袭 AC自动机入门题

2014-10-29 23:03 330 查看
和hdu2222类似,ac自动机入门。

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
#include<queue>
using namespace std;
int ch[100005][128],tot;
char c[505][205];
int cover[505];
vector<int> val[100005];
char d[10005];
int fail[100005];
queue<int> q;
int a[505],cnt;
void get_trie(int n){
int i,j,p,f;
tot=0;
for(i=0;i<n;i++){
p=strlen(c[i]);
f=0;
for(j=0;j<p;j++){
if(ch[f][c[i][j]])f=ch[f][c[i][j]];
else{
ch[f][c[i][j]]=++tot;
f=tot;
}
}
val[f].push_back(i);
}
}
void get_fail(void){
int i,fa,p;
for(i=0;i<128;i++){
if(ch[0][i])q.push(ch[0][i]);
}
while(!q.empty()){
p=q.front();
q.pop();
for(i=0;i<128;i++){
if(ch[p][i]){
q.push(ch[p][i]);
fa=fail[p];
while(fa&&!ch[fa][i]) fa=fail[fa];
fa=ch[fa][i];
fail[ch[p][i]]=fa;
}
}
}
}
int find(char *T){
int i,j,n,m,p,k;
n=strlen(T);
j=0;
cnt=0;
memset(cover,0,sizeof(cover));
for(i=0;i<n;i++){
while(j&&!ch[j][T[i]]) j=fail[j];
j=ch[j][T[i]];
p=j;
while(p){
k=val[p].size();
int f=0;
for(m=0;m<k;m++){
if(cover[val[p][m]]==-1){
f=1;
break;
}
a[cnt++]=val[p][m];
cover[val[p][m]]=-1;
}
if(f) break;
p=fail[p];
}
}
if(cnt>0){
sort(a,a+cnt);
return 0;
}
return 1;
}
int main()
{
int i,j,n,m,p;
scanf("%d",&n);
getchar();
for(i=0;i<n;i++){
gets(c[i]);
}
get_trie(n);
get_fail();
scanf("%d",&m);
p=0;
for(i=0;i<m;i++){
scanf("%s",d);
if(!find(d)){
printf("web %d:",i+1);
for(j=0;j<cnt;j++) printf(" %d",a[j]+1);
printf("\n");
}
else p++;
}
printf("total: %d\n",m-p);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: