给出一个字典和一个模式串,问模式串中出现几个字典中的单词
最后一行是大串,之前输入的是小串
#include<iostream>
#include<cstdio>
using namespace std;
char s[],m[];
int T,n,sz,ans;
int a[][],q[],point[],danger[];
bool mark[];
void ins()
{
int now=,l=strlen(s);
for(int i=;i<l;i++)
{
int t=s[i]-'a'+;
if(a[now][t])now=a[now][t];
else now=a[now][t]=++sz;
}
danger[now]++;
}
void acmach()
{
int t=,w=,now;
q[]=;point[]=;
while(t<w)
{
now=q[t++];
for(int i=;i<=;i++)
{
if(!a[now][i])continue;
int k=point[now];
while(!a[k][i])k=point[k];
point[a[now][i]]=a[k][i];
q[w++]=a[now][i];
}
}
}
void solve()
{
int k=,l=strlen(m);
for(int i=;i<l;i++)
{
mark[k]=;
int t=m[i]-'a'+;
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]=;
}
}
printf("%d\n",ans);
}
int main()
{
scanf("%d",&T);
while(T--)
{
sz=;ans=;
scanf("%d",&n);
for(int i=;i<=;i++)a[][i]=;
while(n--)
{
scanf("%s",s);
ins();
}
acmach();
scanf("%s",m);
solve();
for(int i=;i<=sz;i++)
{
point[i]=danger[i]=mark[i]=;
for(int j=;j<=;j++)
a[i][j]=;
}
}
return ;
}