(最后有解释哦)
0:所需参数
const int N=3e6+10;
int t[N][70],cnt[N],idx;
char s[N];
1.映射字符
int getnum(char x) {
if(x>='A'&&x<='Z') return x-'A';
else if(x>='a'&&x<='z') return x-'a'+26;
else return x-'0'+52;
}
2.插入字符串
void insert(char str[]) {
int p=0,len=strlen(str);
for(int i=0; i<len; i++) {
int c=getnum(str[i]);
if(!t[p][c]) t[p][c]=++idx;
p=t[p][c];
cnt[p]++;
}
}
3.查询操作
int find(char str[]) {
int p=0,len=strlen(str);
for(int i=0; i<len; i++) {
int c=getnum(str[i]);
if(!t[p][c]) return 0;
p=t[p][c];
}
return cnt[p];
}
4:进行(如果多组数据)初始化操作
void insert(char str[]) {
int p=0,len=strlen(str);
for(int i=0; i<len; i++) {
int c=getnum(str[i]);
if(!t[p][c]) t[p][c]=++idx;
p=t[p][c];
cnt[p]++;
}
idx=0;
}
ACcode:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=3e6+10;
int T,q,n,t[N][70],cnt[N],idx;
char s[N];
int getnum(char x) {
if(x>='A'&&x<='Z') return x-'A';
else if(x>='a'&&x<='z') return x-'a'+26;
else return x-'0'+52;
}
void insert(char str[]) {
int p=0,len=strlen(str);
for(int i=0; i<len; i++) {
int c=getnum(str[i]);
if(!t[p][c]) t[p][c]=++idx;
p=t[p][c];
cnt[p]++;
}
}
int find(char str[]) {
int p=0,len=strlen(str);
for(int i=0; i<len; i++) {
int c=getnum(str[i]);
if(!t[p][c]) return 0;
p=t[p][c];
}
return cnt[p];
}
void init() {
for(int i=0; i<=idx; i++) {
for(int j=0; j<=122; j++) {
t[i][j]=0;
}
}
for(int i=0; i<=idx; i++) {
cnt[i]=0;
}
}
void solve() {
init();
idx=0;
cin>>n>>q;
for(int i=1;i<=n;i++){
cin>>s;
insert(s);
}
for(int i=1;i<=q;i++){
cin>>s;
cout<<find(s)<<"\n";
}
}
signed main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
int t=1;
cin>>t;
while(t--) {
solve();
}
return 0;
}