hdu 2896 病毒侵袭(简单AC自动机)
#include <stdio.h>
#include <string.h>
#define MAXKIND 129
#define MAXN 505
#define MAXLEN 10005
#define MAXQSIZE 500005
typedef struct TNode
{
TNode()
{
id=-1;
fail=NULL;
memset(next,0,sizeof(next));
}
int id;
TNode *fail;
TNode *next[MAXKIND];
}*Trie;
void insert(Trie p,char *key,int idx)
{
while(*key)
{
int i=*key;
if(!p->next[i]) p->next[i]=new TNode;
p=p->next[i];
key++;
}
p->id=idx;
}
TNode *que[MAXQSIZE];
void build_ac(Trie root)
{
root->fail=NULL;
int front=-1,rear=-1;
que[++rear]=root;
TNode *out;
while(front<rear)
{
out=que[++front];
for(int i=0;i<MAXKIND;i++)
{
if(out->next[i])
{
que[++rear]=out->next[i];
if(out==root) out->next[i]->fail=root;
else
{
TNode *tmp=out->fail;
while(tmp)
{
if(tmp->next[i])
{
out->next[i]->fail=tmp->next[i];
break;
}
tmp=tmp->fail;
}
if(!tmp) out->next[i]->fail=root;
}
}
}
}
}
bool search(Trie root,char *pat,bool *arr)
{
int i;
bool flag=false;
TNode *p=root;
while(*pat)
{
i=*pat;
while(!p->next[i] && p!=root) p=p->fail;
p=p->next[i];
if(!p) p=root;
TNode *tmp=p;
while(tmp->id != -1 && !arr[tmp->id] && tmp != root)
{
arr[p->id]=true;
flag=true;
tmp=tmp->fail;
}
pat++;
}
return flag;
}
char str[MAXLEN];
bool tag[MAXN];
int main()
{
#ifndef ONLINE_JUDGE
freopen("tdata.txt","r",stdin);
#endif
int i,n,m;
while(scanf("%d",&n)!=EOF)
{
memset(tag,false,sizeof(tag));
Trie tree=new TNode;
for(i=1;i<=n;i++)
{
scanf("%s",str);
insert(tree,str,i);
}
build_ac(tree);
scanf("%d",&m);
int cnt=0;
for(i=1;i<=m;i++)
{
scanf("%s",str);
if( search(tree,str,tag) )
{
cnt++;
printf("web %d:",i);
for(int j=1;j<MAXN;j++)
if(tag[j]) printf(" %d",j);
printf("\n");
memset(tag,false,sizeof(tag));
}
}
printf("total: %d\n",cnt);
}
return 0;
}
浙公网安备 33010602011771号