原题:http://acm.hdu.edu.cn/showproblem.php?pid=1251
前面先插一句: 假如你做字典树的题tle然后思路没错的话,可能是你将那棵树memset了。我一开始就是memset了树导致tle。详情请看https://blog.csdn.net/mhd2312/article/details/81987075
我选择用数组做的字典树,我认为比较难理解的点应该就在建树的时候,建树的思想类似于线段树。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
const int maxn = 1e6+7;
int trie[maxn][30], res[maxn];
int ind = 0;
void insert(char *S) {
int end = strlen(S);
int lev = 0;
for (int i = 0; i < end; i++) {
int trans = S[i] - 'a';
if (trie[lev][trans]==0) trie[lev][trans] = ++ind;
lev = trie[lev][trans];
res[lev]++;
}
}
int query(char *S) {
int len = strlen(S);
int q = 0;
for (int i = 0; i < len; i++) {
int trans = S[i] - 'a';
if (trie[q][trans] == 0) return 0;
q = trie[q][trans];
}
return res[q];
}
int main() {
// memset(trie, 0, sizeof(trie));
memset(res,0,sizeof(res));
char s[maxn];
while (gets(s)) {
if(s[0]=='\0') break;
insert(s);
}
while (gets(s)) {
printf("%d\n", query(s));
}
return 0;
}