http://acm.hdu.edu.cn/showproblem.php?pid=2222
A template problem for an AC automaton. Use the Kuangbin template to statically build the trie tree. Possible to encounter the situation of MLE to dynamic achievements.
An explanation of AC automata look here
http://blog.csdn.net/niushuai666/article/details/7002823
http://blog.csdn.net/mobius_strip/article/details/22549517
/*--------------------------------------------------------------------------------------*///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;structtrie{intnext[500010][ -],fail[500010],end[500010]; introot,l; intNewNode () { for(intI=0;i< -; i++) Next[l][i] =-1; End[l++] =0; returnL-1; } voidinit () {L=0; 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]++; } 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]); } } } } intQueryChar*s) {intLen =strlen (s); intnow =Root; intAns =0; for(intI=0; i<len;i++) { now= next[now][s[i]-'a']; inttemp =Now ; while(Temp! =root) {ans+=End[temp]; End[temp]=0; Temp=Fail[temp]; } } returnans; } 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"); } }};Charbuf[1000100]; Trie AC;intMain () {scanf ("%d",&T); while(t--) {ac.init (); scanf ("%d",&N); for(intI=0; i<n;i++) {scanf ("%s", BUF); Ac.insert (BUF); } ac.build (); //Ac.debug ();scanf"%s", BUF); printf ("%d\n", Ac.query (BUF)); }}
Nth-Entry AC automata ... Success...
AC Automaton-hdu2222-template problem