详细解释 请见 解释
#include<bits/stdc++.h>
#define inf 0x7fffffff
#define linf 0x7fffffffffffffff
#define mem(a,b) memset(a,b,sizeof(a))
#define fup(i,x,y) for(int i=(x);i<=(y);i++)
#define fdn(i,x,y) for(int i=(x);i>=(y);i--)
#define sp(x) setprecision(x)
#define sd(n) scanf("%d",&n)
#define sdd(n,m) scanf("%d%d",&n,&m)
#define sddd(n,m,k) scanf("%d%d%d",&n,&m,&k)
#define sld(n) scanf("%lld",&n)
#define sldd(n,m) scanf("%lld%lld",&n,&m)
#define slddd(n,m,k) scanf("%lld%lld%lld",&n,&m,&k)
#define sf(n) scanf("%lf",&n)
#define sff(n,m) scanf("%lf%lf",&n,&m)
#define sfff(n,m,k) scanf("%lf%lf%lf",&n,&m,&k)
#define sc(n) scanf("%s",n)
#define lowbit(x) (x&(-x))
#define pf(x) printf("%d\n",x)
#define pfl(x) printf("%lld\n",x)
#define pff(x) printf("%lf\n",x)
#define debug printf("!!\n");
#define N 1000005
#define M 4000009
#define pi acos(-1)
#define eps 1e-2
//cout.setf(ios::fixed);
//freopen("out.txt","w",stdout);// freopen("in.txt","r",stdin);
using namespace std;
typedef long long ll;
typedef double db;
using namespace std;
typedef long long ll;
const int maxn = 5e5+10;
const int sz=4;
int ne[maxn][30],fail[maxn],ed[maxn];
int tot;
void init()
{
mem(ne,0);
mem(ed,0);
tot=0;
}
void add(char *k)
{
int len=strlen(k),r=0;
fup(i,0,len-1)
{
int id=k[i]-'a';
if(!ne[r][id]) ne[r][id]=++tot;
r=ne[r][id];
}
ed[r]++;
}
void buildfail()
{
queue<int> q;
int r=0;
fup(i,0,25)
{
if(ne[r][i])
{
fail[ne[r][i]]=0;
q.push(ne[r][i]);
}
}
while(!q.empty())
{
int now=q.front();
q.pop();
fup(i,0,25)
{
if(ne[now][i])
{
fail[ne[now][i]]=ne[fail[now]][i];
q.push(ne[now][i]);
}
else ne[now][i]=ne[fail[now]][i];
}
}
}
int query(char *k)
{
int len=strlen(k),now=0;
int ans=0;
fup(i,0,len-1)
{
int id=k[i]-'a';
now=ne[now][id];
int tp=now;
while(tp)
{
ans+=ed[tp];
ed[tp]=0;
tp=fail[tp];
}
}
return ans;
}
char s1[1000010];
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n;
scanf("%d",&n);
init();
for(int i=0;i<n;i++)
{
scanf("%s",s1);
add(s1);
}
buildfail();
scanf("%s",s1);
printf("%d\n",query(s1));
}
return 0;
}