(最后有解释哦)
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;
}