挂一个模板题QAQ(其实是我忘了AC自动机怎么写了)
#include<bits/stdc++.h>
#define N 500005
using namespace std;
int T,n,cnt,ans,a[N][27],sum[N],p[N],q[N];
bool v[N];
char s[N<<1],ss[55];
inline void insert()
{
scanf("%s",ss);
int x=1,c,l=strlen(ss);
for (int i=0;i<l;i++)
{
c=ss[i]-'a'+1;
if (a[x][c]) x=a[x][c]; else x=a[x][c]=++cnt;
}
sum[x]++;
}
inline void build_fail()
{
int t=0,w=1,x;
q[1]=1; p[1]=0;
while (t<w)
{
x=q[++t];
for (int i=1;i<=26;i++)
if (a[x][i])
{
int k=p[x];
while (!a[k][i]) k=p[k];
p[a[x][i]]=a[k][i];
q[++w]=a[x][i];
}
}
}
inline void Ac_machine()
{
scanf("%s",s);
int x=1,c,l=strlen(s);
for (int i=0;i<l;i++)
{
c=s[i]-'a'+1;
v[x]=1;
while (!a[x][c]) x=p[x];
x=a[x][c];
if (!v[x])
for (int j=x;j;j=p[j]) ans+=sum[j],sum[j]=0;
}
}
int main()
{
scanf("%d",&T);
while (T--)
{
scanf("%d",&n);
cnt=1; ans=0;
for (int i=1;i<=26;i++) a[0][i]=1;
for (int i=1;i<=n;i++) insert();
build_fail();
Ac_machine();
printf("%d\n",ans);
for (int i=1;i<=cnt;i++)
{
p[i]=sum[i]=v[i]=0;
for (int j=1;j<=26;j++) a[i][j]=0;
}
}
return 0;
}