#include<cstring>
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<queue>
#define INF 0x3f3f3f3f
#pragma comment(linker, "/STACK:1024000000,1024000000")
using namespace std;
typedef long long LL;
const int SIGMA_SIZE=26;
const int MAXN=100010;
const int MAXNODE=600010;
const LL MOD= 258280327;
int T,N,M;
LL ans;
string str1[MAXN],str2[MAXN];
struct AC{
int ch[MAXNODE][SIGMA_SIZE],f[MAXNODE],sz;
LL val[MAXNODE];
void init(){
memset(ch[0],0,sizeof(ch[0]));
val[0]=0;
sz=1;
}
inline int idx(char c){
return c-'a';
}
void insert(string s){
int u=0,len=s.size();
for(int i=0;i<len;i++){
int c=idx(s[i]);
if(!ch[u][c]){
memset(ch[sz],0,sizeof(ch[sz]));
val[sz]=0;
ch[u][c]=sz++;
}
u=ch[u][c];
}
val[u]++;
}
void get_fail(){
queue<int> q;
f[0]=0;
for(int c=0;c<SIGMA_SIZE;c++){
int u=ch[0][c];
if(u){
f[u]=0;
q.push(u);
}
}
while(!q.empty()){
int r=q.front();
q.pop();
for(int c=0;c<SIGMA_SIZE;c++){
int u=ch[r][c];
if(!u){
ch[r][c]=ch[f[r]][c];
continue;
}
q.push(u);
f[u]=ch[f[r]][c];
val[u]+=val[f[u]];
}
}
}
void find(string T){
int j=0;
int len=T.size();
for(int i=0;i<len;i++){
int c=idx(T[i]);
j=ch[j][c];
ans+=val[j];
}
}
}ac;
int main(){
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt", "w", stdout);
#endif // ONLINE_JUDGE
scanf("%d",&T);
while(T--){
scanf("%d%d",&N,&M);
for(int i=1;i<=N;i++) cin>>str1[i];
for(int i=1;i<=M;i++) cin>>str2[i];
ac.init();
for(int i=1;i<=M;i++) ac.insert(str2[i]);
ac.get_fail();
for(int i=1;i<=N;i++){
ans=0;
ac.find(str1[i]);
printf("%I64d\n",ans);
}
}
return 0;
}
hdu 5384 Danganronpa
最新推荐文章于 2021-10-08 18:43:05 发布