aqua__ @ 2024-02-18 22:47:30
#include<iostream>
using namespace std;
const int N = 100010,M = 3000030;
int son[M][52],cnt[M],idx;
char a[N];
int n,q;
void insert(char *str){
int p = 0;
for(int i = 0;str[i];i ++ ){
int u = str[i] - 'A';
if(!son[p][u]){
son[p][u] = ++ idx;
}
p = son[p][u];
cnt[p] ++;
}
}
int query(char *str){
int p = 0;
for(int i = 0;str[i];i ++ ){
int u = str[i] - 'A';
if(!son[p][u]){
return 0;
}
p = son[p][u];
}
return cnt[p];
}
int main(){
int T;
cin >> T;
while(T -- ){
cin >> n >> q;
for(int i = 0;i < n;i ++ ){
cin >> a;
insert(a);
}
for(int i = 0;i < q;i ++ ){
cin >> a;
cout << query(a) << endl;
}
}
return 0;
}
by ZRZ0818 @ 2024-03-04 20:37:03
输入的字符串有大写小写字母和数字三种可能,需要分别判断;而且字典树数组的第二维开太小了.
因为有多组数据,所以字典树数组、计数数组和 idx变量都需要重置
(重置数组要用循环重置,用memset会T, 别问我为什么知道)