http://acm.hdu.edu.cn/showproblem.php?pid=2896
Another AC automaton template problem, but this problem needs to record a specific match.
/*--------------------------------------------------------------------------------------*///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;intTol;structtrie{intnext[100010][ -],fail[100010],end[100010]; intnum[100010]; introot,l; intCNT; intNewNode () { for(intI=0;i< -; i++) Next[l][i]= -1; End[l++] =0; returnL-1; } voidinit () {L=0; Root=NewNode (); memset (num,0,sizeofnum); CNT=1; } voidInsertChar*s) {intLen =strlen (s); intnow =Root; for(intI=0; i<len;i++) { if(next[now][s[i]-'!'] == -1) Next[now][s[i]-'!'] =NewNode (); now= next[now][s[i]-'!']; } End[now]++; Num[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,intNO) { intLen =strlen (s); intnow =Root; intAns =0; Set<int>web; for(intI=0; i<len;i++) { now= next[now][s[i]-'!']; inttemp =Now ; while(Temp! =root) {ans+=End[temp]; if(End[temp]) Web.insert (num[temp]); Temp=Fail[temp]; } } if(!Web.empty ()) {printf ("Web%d:", no); for(Set<int>::iterator It=web.begin (); It! = Web.end (); it++) printf ("%d",*it); printf ("\ n"); Tol++; }}}ac;Charbuf[10010];intMain () { while(~SCANF ("%d",&N)) {ac.init (); Tol=0; for(intI=0; i<n;i++) {scanf ("%s", BUF); Ac.insert (BUF); } ac.build (); scanf ("%d",&l); for(intI=1; i<=m;i++) {scanf ("%s", BUF); Ac.query (Buf,i); } printf ("Total:%d\n", Tol); }}
AC Automaton-hdu2896-template problem