http://acm.hdu.edu.cn/showproblem.php?pid=3065
An AC automaton that needs to record a match is not emptied of some arrays resulting in several rounds of WA.
/*--------------------------------------------------------------------------------------*///Helica ' s header//Second Editions//2015.11.7//#include <algorithm>#include<iostream>#include<cstring>#include<ctype.h>#include<cstdlib>#include<cstdio>#include<vector>#include<string>#include<queue>#include<stack>#include<cmath>#include<Set>#include<map>//Debug function for a n*m array#defineDebug_map (n,m,g) printf ("\ n"); for (int i=0;i< (N); i++) \{ for(intj=0;j< (M); J + +) {printf ("%d", G[i][j]);} printf"\ n");} //Debug function for int,float,double,etc.#defineDebug_var (X) cout<< #X "=" <<X<<endl;/*--------------------------------------------------------------------------------------*/using namespacestd;intn,m,t,ans[ -];Charbuf[2000100];map<int,string>m;structtrie{intnext[50010][ -],fail[50010],end[50010],index[50010]; introot,l,cnt; intNewNode () { for(intI=0;i< -; i++) Next[l][i] =-1; End[l++] =0; returnL-1; } voidinit () {L=0; CNT=0; memset (Index,0,sizeofindex); memset (ans,0,sizeofans); Root=NewNode (); } voidInsertChar*s) {intLen =strlen (s); intnow =Root; for(intI=0; i<len;i++) { if(next[now][s[i]-'A'] == -1) Next[now][s[i]-'A'] =NewNode (); now= next[now][s[i]-'A']; } End[now]++; Index[now]= cnt++; } voidbuild () {Queue<int>Q; Fail[root]=Root; for(intI=0;i< -; i++) if(Next[root][i] = =-1) Next[root][i]=Root; Else{Fail[next[root][i]]=Root; Q.push (Next[root][i]); } while(!Q.empty ()) { intnow =Q.front (); Q.pop (); for(intI=0;i< -; i++) { if(Next[now][i] = =-1) Next[now][i]=Next[fail[now]][i]; Else{Fail[next[now][i]]=Next[fail[now]][i]; Q.push (Next[now][i]); } } } } voidQueryChar*s) {intLen =strlen (s); intnow =Root; for(intI=0; i<len;i++) { if(s[i]<'A'|| S[i]>'Z') { now=Root; Continue; } Now= next[now][s[i]-'A']; inttemp =Now ; while(Temp! =root) {Ans[index[temp]]+=End[temp]; Temp=Fail[temp]; } } } voidDebug () { for(intI=0; i<l;i++) {printf ("id =%3d,fail =%3d,end =%3d,chi = [", I,fail[i],end[i]); for(intj=0;j< -; j + +) printf ("%2d", Next[i][j]); printf ("]\n"); }}}ac;intMain () { while(~SCANF ("%d",&N)) {ac.init (); M.clear (); for(intI=0; i<n;i++) {scanf ("%s", BUF); M.insert (Pair<int,string> (I,string(BUF))); Ac.insert (BUF); } getchar (); Ac.build (); scanf ("%s", BUF); Ac.query (BUF); for(intI=0; i<n;i++)if(Ans[i]) {printf ("%s:%d\n", M[i].c_str (), ans[i]); } }}
-hdu3065-simple problem of AC automatic machine