一个自动AC的东西...
套用KMP的fail指针,然后再是利用字典树进行字典与文章的匹配
以下是模板
#include<bits/stdc++.h>
using namespace std;
#define FOR(i,x,y) for(int i=(x),i##_end_=(y);i<=i##_end_;i++)
#define DOR(i,x,y) for(int i=(x),i##_end_=(y);i>=i##_end_;i--)
struct Aro{
static const int maxn=500005;
int tot,pre[maxn][26],fail[maxn],cnt[maxn],Q[maxn];
int newnode(){
tot++;
FOR(i,0,25)pre[tot][i]=0;
cnt[tot]=fail[tot]=0;
return tot;
}
void init(){tot=-1;newnode();}
void build(){
int L=0,R=0;
FOR(i,0,25)if(pre[0][i])Q[++R]=pre[0][i];
while(L<R){
int k=Q[++L];
FOR(i,0,25){
if(pre[k][i]){
Q[++R]=pre[k][i];
fail[pre[k][i]]=pre[fail[k]][i];
}
else pre[k][i]=pre[fail[k]][i];
}
}
}
void insert(char *str){
int len=strlen(str),cur=0;
FOR(i,0,len-1){
int k=str[i]-'a';
if(!pre[cur][k])pre[cur][k]=newnode();
cur=pre[cur][k];
}
cnt[cur]++;
}
int query(char *str){
int len=strlen(str),cur=0,ans=0;
FOR(i,0,len-1){
int k=str[i]-'a';
cur=pre[cur][k];
int now=cur;
while(~cnt[now]&&now){
ans+=cnt[now];
cnt[now]=-1;
now=fail[now];
}
}
return ans;
}
}ACA;
char str1[1000005];
int main(){
int T;
scanf("%d",&T);
while(T--){
int n;
scanf("%d",&n);
ACA.init();
FOR(i,1,n){
char str[55];
scanf("%s",str);
ACA.insert(str);
}
ACA.build();
scanf("%s",str1);
printf("%d\n",ACA.query(str1));
}
return 0;
}