hdu3065 AC自动机
比较简单。
#include<stdio.h> #include<string.h> #include<stdlib.h> #define kind 96 #define maxn 2000000 struct node { node *fail; node *next[kind]; int flag; int id; void init(){ fail=NULL; memset(next,NULL,sizeof(next)); flag=0; id=0; } }*q[500000]; node *root; int head,tail; char str[1002][52],s[maxn]; int vis[1005]; void insert(char *s,int c) { node *p=root,*qq; int i,j,len=strlen(s); for(i=0;i<len;i++) { int id=s[i]-32; if(p->next[id]==NULL) { qq=new node; qq->init(); p->next[id]=qq; } p=p->next[id]; } p->flag++; p->id=c; } void build_ac() { int i; node *temp,*p; head=tail=0; q[tail++]=root; while(head!=tail) { p=q[head++]; for(i=0;i<kind;i++) { if(p->next[i]!=NULL) { if(p==root) p->next[i]->fail=root; else { temp=p->fail; while(temp!=NULL) { if(temp->next[i]!=NULL) { p->next[i]->fail=temp->next[i]; break; } temp=temp->fail; } if(temp==NULL) p->next[i]->fail=root; } q[tail++]=p->next[i]; } } } } void query(char *s) { node *p=root,*temp; int i,j,len=strlen(s); for(i=0;i<len;i++) { int id=s[i]-32; while(p->next[id]==NULL&&p!=root) { p=p->fail; } p=p->next[id]; if(p==NULL) p=root; temp=p; while(temp!=root&&temp->flag>0) { vis[temp->id]++; temp=temp->fail; } } } void freenode(node *root) { for(int i=0;i<kind;i++) { if(root->next[i]!=NULL) freenode(root->next[i]); } free(root); } int main() { int i,j,n; while(scanf("%d",&n)!=EOF) { root=new node; root->init(); memset(vis,0,sizeof(vis)); for(i=1;i<=n;i++) { scanf("%s",str[i]); insert(str[i],i); } build_ac(); scanf("%s",s); query(s); for(i=1;i<=n;i++) { if(vis[i]>0) printf("%s: %d\n",str[i],vis[i]); } freenode(root); } }