[HDU2222]Keywords Search(AC自动机)
Solution
真的是模版
Code
#include <cstdio> #include <algorithm> #include <cstring> #define N 500010 using namespace std; char s[N*2]; int n,cas,T[N][27],fail[N],q[N],tot,h,t,num[N]; inline void Insert(){ scanf("%s",s); int len=strlen(s),now=1; for(int i=0;i<len;++i){ if(!T[now][s[i]-96]) T[now][s[i]-96]=++tot; now=T[now][s[i]-96]; } num[now]++; } inline void getfail(){ int k,now; for(int i=1;i<=26;++i) T[0][i]=1; h=0,t=1;q[1]=1; while(h<t){ now=q[++h]; for(int i=1;i<=26;++i) if(T[now][i]){ k=fail[now]; while(!T[k][i]) k=fail[k]; fail[q[++t]=T[now][i]]=T[k][i]; }else T[now][i]=T[fail[now]][i]; } } inline void Init(){ memset(T,0,sizeof(T)); memset(fail,0,sizeof(fail)); memset(num,0,sizeof(num)); tot=1; } int calc(){ scanf("%s",s); int len=strlen(s),now=1,res=0; for(int i=0;i<len;++i){ now=T[now][s[i]-96]; int tmp=now; while(tmp){ res+=num[tmp]; num[tmp]=0; tmp=fail[tmp]; } } return res; } int main(){ scanf("%d",&cas); while(cas--){ Init(); scanf("%d",&n); for(int i=1;i<=n;++i) Insert(); getfail(); printf("%d\n",calc()); } return 0; }