hdu 2896 病毒侵袭_ac自动机
题意:略
思路:套用ac自动机模板
#include <iostream> #include<cstdio> #include<cstring> using namespace std; char str[11000]; int total,head,tail; struct node{ node *next[130]; node *fail; int cnt,id; node(){ fail=NULL; cnt=0; memset(next,NULL,sizeof(next)); } }*q[500000]; void insert(node *root,int id){ node *p=root; int i=0,index; while(str[i]){ index=str[i]-31; if(p->next[index]==NULL) p->next[index]=new node(); p=p->next[index]; i++; } p->cnt++; p->id=id; } void build_ac(node *root){ root->fail=NULL; q[head++]=root; node *p=NULL; while(head!=tail){ node *temp = q[tail++]; for(int i=0;i<=128;i++){ if(temp->next[i]!=NULL){ if(temp==root) temp->next[i]->fail=root; else{ p=temp->fail; while(p!=NULL){ if(p->next[i]!=NULL){ temp->next[i]->fail=p->next[i]; break; } p=p->fail; } if(p==NULL) temp->next[i]->fail=root; } q[head++]=temp->next[i]; } } } } bool ans[1000]; int cnt; int query(node *root){ int i=0,index; node *p=root; while(str[i]){ index=str[i]-31; while(p->next[index]==NULL&&p!=root) p=p->fail; p=p->next[index]; p=(p==NULL)?root:p; node *temp=p; while(temp!=root&&temp->cnt>0){ if(ans[temp->id]==false) cnt++,ans[temp->id]=true; temp=temp->fail; } i++; } } int main(int argc, char** argv) { int n,m,total,i,j; while(scanf("%d",&n)!=EOF){ node *root=new node(); head=tail=total=0; for(i=0;i<n;i++){ scanf("%s",str); insert(root,i+1); } scanf("%d",&m); build_ac(root); for(i=1;i<=m;i++){ memset(ans,false,sizeof(ans)); cnt=0; scanf("%s",str); query(root); if(cnt>0){ printf("web %d:",i); for(j=1;j<=500;j++) if(ans[j]==1) printf(" %d",j); printf("\n"); total++; } } printf("total: %d\n",total); } return 0; }
不怕路长,只怕心老.