AC自动机裸题,直接上模板。
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
char s[51],m[1000001];
int T,n,siz,ans;
int a[500001][27],q[500001],point[500001],danger[500001];
bool mark[500001];
void ins()
{
int now=1,l=strlen(s);
for(int i=0;i<l;i++)
{
int t=s[i]-'a'+1;
if(a[now][t])now=a[now][t];
else now=a[now][t]=++siz;
}
danger[now]++;
}
void acmach()
{
int head=0,tail=1,k,now;
q[1]=1;point[1]=0;
while(head<tail)
{
head++;
now=q[head];
for(int i=1;i<=26;i++)
{
if(!a[now][i]) continue;
k=point[now];
while(!a[k][i]) k=point[k];
point[a[now][i]]=a[k][i];
tail++;
q[tail]=a[now][i];
}
}
}
void solve()
{
int k=1,l=strlen(m);
for(int i=0;i<l;i++)
{
mark[k]=1;
int t=m[i]-'a'+1;
while(!a[k][t]) k=point[k];
k=a[k][t];
if(!mark[k])
{
for(int j=k;j;j=point[j])
{
ans+=danger[j];
danger[j]=0;
}
}
}
printf("%d\n",ans);
}
int main()
{
scanf("%d",&T);
while(T--)
{
siz=1;ans=0;
scanf("%d",&n);
for(int i=1;i<=26;i++)a[0][i]=1;
while(n--)
{
scanf("%s",s);
ins();
}
acmach();
scanf("%s",m);
solve();
for(int i=1;i<=siz;i++)
{
point[i]=danger[i]=mark[i]=0;
for(int j=1;j<=26;j++)
a[i][j]=0;
}
}
return 0;
}
/*
1
5
sher
he
say
shr
her
*/