救救我,字典树18分
查看原帖
救救我,字典树18分
167697
BartAllen楼主2023/1/31 18:38
#include <bits/stdc++.h>
using namespace std;

const int N = 3e6 + 5;

int t, q, n, tot = 1;
int trie[N][65], cnt[N];
string s;

int getint(char c) {
	if (c >= 'a' && c <= 'z') return c - 'a' + 26;
	if (c >= 'A' && c <= 'Z') return c - 'A';
	if (c >= '0' && c <= '9') return c - '0' + 52;
}

void insert(string str) {
	int len = str.size(), p = 1;
	for (int k = 0; k < len; k++) {
		int ch = getint(str[k]);
		if (!trie[p][ch]) trie[p][ch] = ++tot;
		p = trie[p][ch];
		cnt[p]++;
	}
}

int search(string str) {
	int len = str.size(), p = 1;
	for (int k = 0; k < len; k++) {
		p = trie[p][getint(str[k])];
		if (!p) return 0;
	}
	return cnt[p];
}

int main() {
	int i, j;
	scanf("%d", &t);
	while (t--) {
		for (i = 1; i <= tot; i++)
			for (j = 1; j <= 130; j++) trie[i][j] = 0;
		for (i = 1; i <= tot; i++) cnt[i] = 0;
		tot = 0;
		scanf("%d%d", &n, &q);
		for (i = 1; i <= n; i++) {
			cin >> s;
			insert(s);
		}
		for (i = 1; i <= q; i++) {
			cin >> s;
			printf("%d\n", search(s));
		}
	}
	return 0;
}
2023/1/31 18:38
加载中...