#include<bits/stdc++.h>
#pragma GCC optimize(2)
using namespace std;
int cnt=1,n,tot;
struct oi{
int son[30],jc,tail;
}tree[1000010],ban[1000010];
inline void jian(string t){
int u=1;
for(register int i=0;i<t.size();i++){
if(!tree[u].son[t[i]-'a']||ban[u].son[t[i]-'a']!=tot){
tree[u].son[t[i]-'a']=++cnt;
ban[u].son[t[i]-'a']=tot;
}
u=tree[u].son[t[i]-'a'];
}
if(ban[u].jc!=tot){
tree[u].jc=1;
ban[u].jc=tot;
}
else{
tree[u].jc++;
}
return;
}
queue<int> q;
inline void get(){
while(!q.empty()){
q.pop();
}
for(register int i=0;i<26;i++){
tree[0].son[i]=1;
ban[0].son[i]=tot;
}
q.push(1);tree[1].tail=0;
ban[1].tail=tot;
while(!q.empty()){
int u=q.front();
q.pop();
for(register int i=0;i<26;i++){
int v=tree[u].son[i];
if(ban[u].son[i]!=tot){
v=0;
}
if(!v){
tree[u].son[i]=tree[tree[u].tail].son[i];
ban[u].son[i]=tot;
continue;
}
tree[v].tail=tree[tree[u].tail].son[i];
ban[v].tail=tot;
q.push(v);
}
}
return;
}
inline int sum(string s){
int ans=0,u=1;
for(register int i=0;i<s.size();i++){
int v=s[i]-'a';
int k=tree[u].son[v];
int last=ans;
while(k&&(!(tree[k].jc==-1&&ban[k].jc==tot))){
if(ban[k].jc!=tot){
tree[k].jc=0;
}
ans+=tree[k].jc;
tree[k].jc=-1;
ban[k].jc=tot;
k=tree[k].tail;
}
u=tree[u].son[v];
}
return ans;
}
char t[1000010];
signed main(){
freopen("hack.in","r",stdin);
cin.tie(0);cout.tie(0);
ios::sync_with_stdio(0);
int T;
cin>>T;
while(T--){
cnt=1;
cin>>n;
for(register int i=1;i<=n;i++){
cin>>t;
jian(t);
}
get();
cin>>t;
cout<<sum(t)<<'\n';
tot++;
}
return 0;
}
把这个题
的每个点都卡到1秒以内!!!
(阴暗爬行)