Description
XX 最近遇到一个难题:老师交给他一本字典,这本字典里有100000 个单词(单词只有小写字母组成,并且不会有重复的单词出现),现在老师要他在这本字典中查找出以某个字符串为前缀的单词的数量(单词本身也是自己的前缀)。
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是字典里的单词,一个空行代表单词表的结束。。第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串(长度不超过10)。
注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,输出以该字符串为前缀的单词的数量.
Sample Input
Raw
banana
band
bee
absolute
acm
ba
b
band
abc
Sample Output
Raw
2
3
1
0
Hint
简单字典树。。
Tags
————————————————————————————————————————————————————————
解题思路:
就是一个简单的字典树,对每个节点统计下面的子节点个数,注意输入时一个空行结束。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
const int MAX_NODE = 1000000 + 10;
const int CHARSET = 26;
int trie[MAX_NODE][CHARSET] = {0};
int sum[MAX_NODE] = {0};
int k = 1;
void insert_tree(char *str){//建树
int len = strlen(str);
int p = 0;
for(int i=0; i<len; i++){
int c = str[i] - 'a';
if(!trie[p][c]){
trie[p][c] = k;
k++;
}
p = trie[p][c];
sum[p]++;
}
}
int search_tree(char *str){//查询
int len = strlen(str);
int p = 0;
for(int i=0; i<len; i++){
int c = str[i] - 'a';
if(!trie[p][c]) return 0;
p = trie[p][c];
}
return sum[p];
}
int main(){
char str[20];
while (gets(str) && strlen(str)) {
insert_tree(str);
}
while (gets(str))
printf("%d\n", search_tree(str));
return 0;
}