hdu2222
code
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;
const int N=1e6+10,M=1e6+10;
queue<int> d;
char s[N];
int n;
struct ac{
int a[M*10][26],fail[M*50],sum[M*50],tot;
int makenew() {
memset(a[tot],-1,sizeof(a[tot]));
fail[tot]=sum[tot]=0;
return tot++;
}
void insert(char s[]){
int x=0,i,j,k,len=strlen(s);
for (i=0;i<len;i++) {
if (a[x][s[i]-'a']==-1) a[x][s[i]-'a']=makenew();
x=a[x][s[i]-'a'];
}
sum[x]++;
}
void build() {
int i,j,k;
for (i=0;i<26;i++) {
if (a[0][i]==-1) a[0][i]=0;
else fail[a[0][i]]=0,d.push(a[0][i]);
}
while (!d.empty()) {
int x=d.front();
for (i=0;i<26;i++) {
if (a[x][i]==-1) a[x][i]=a[fail[x]][i];
else fail[a[x][i]]=a[fail[x]][i],d.push(a[x][i]);
}
d.pop();
}
}
int query(char s[]){
int x=0,len=strlen(s),tot=0;
for (int i=0;i<len;i++) {
x=a[x][s[i]-'a'];
int y=x;
while (y!=0) {
tot+=sum[y];
sum[y]=0;
y=fail[y];
}
}
return tot;
}
void init() {
tot=0;
makenew();
}
}aca;
void work() {
int i,j,k;
scanf("%d",&n);
scanf("\n");
aca.init();
for (i=1;i<=n;i++) {
scanf("%s",s);
aca.insert(s);
}
aca.build();
scanf("%s",s);
printf("%d\n",aca.query(s));
}
int main() {
int t;scanf("%d",&t);
while (t--) work();
}