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;
}