MLE countless hair. After the change of C + + handed over ...
A tag array.
#include <stdio.h>#include<string.h>#include<stdlib.h>#include<algorithm>#defineMAXN 10010using namespacestd;structactrie{Actrie*fail; Actrie*next[94]; intFlag; intID; voidinit () {fail=NULL; memset (Next,null,sizeof(next)); Flag=0; }}*q[60200];actrie*Root;Chars[maxn],str[ About];intvis[550];voidInsertChar*s,intc) {Actrie*p=root,*QQ; inti,j,len=strlen (s); for(i=0; i<len;i++) { intid=s[i]- +; if(p->next[id]==NULL) {QQ=NewActrie; QQ-init (); P->next[id]=QQ; } P=p->Next[id]; } P->flag++; P->id=c+1;}voidGetfail () {Actrie*p,*temp; inti,j; intHead,tail; Head=tail=0; Q[tail++]=Root; while(head!=tail) {P=q[head++]; for(i=0;i<94; i++) { if(p->next[i]==NULL)Continue; 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]; } } }}intQueryChar*s) { inti,len=strlen (s), flag; Actrie*p=root,*temp; Flag=0; memset (Vis,0,sizeof(VIS)); for(i=0; i<len;i++) { intid=s[i]- +; while(p->next[id]==null&&p!=root) P=p->fail; P=p->Next[id]; if(p==NULL) P=Root; Temp=p; while(temp!=root) { if(temp->flag>0) {vis[temp->id]=1; Flag=1; } temp=temp->fail; } } returnFlag;}intMain () {inti,j,t,n,m; while(SCANF ("%d", &n)! =EOF) {Root=NewActrie; Root-init (); for(i=0; i<n;i++) {scanf ("%s", str); Insert (str,i); } getfail (); scanf ("%d",&m); intans=0; for(i=0; i<m;i++) {scanf ("%s", s); if(query (s)) {ans++; printf ("Web%d:", i+1); for(j=1; j<=n;j++) if(Vis[j]) printf ("%d", J); printf ("\ n"); }} printf ("Total:%d\n", ans); }}
hdu2896 AC automatic Machine