题目链接:点击打开链接
题目大意:先给出一串单词,然后给出前缀,问那串单词中有几个单词有这个前缀。
题目思路:第一次用字典树,感觉美滋滋...其实就是给每一个节点都设置一个它独有的编号,每个节点最多有26个子节点(仅有小写字母的情况下),那个独有的编号就作为他的root,根据判断trie[root][n](n为下一个字母对应的数字,ascii码-‘a')是否存在。再来个数组记录每个前缀出现的次数就ok了。
以下是代码:
#include <iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int trie[1000005][26],num[1000005]={0};
int tot=1;
void cha(char str[]){
int root=0;
for(int i=0;i<strlen(str);i++){
int n=str[i]-'a';
if(trie[root][n]==0){
trie[root][n]=tot++;
}
root=trie[root][n];
num[root]++;
}
}
int Find(char str[]){
int root=0;
for(int i=0;i<strlen(str);i++){
int n=str[i]-'a';
if(trie[root][n]==0){
return 0;
}
root=trie[root][n];
}
return num[root];
}
int main()
{
char str[15];
while(gets(str)){
if(str[0]==NULL){
break;
}
cha(str);
}
while(gets(str)){
printf("%d\n",Find(str));
}
return 0;
}