hdu 1251 统计难题//trie树

统计难题

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 6162    Accepted Submission(s): 2292

Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 

 

Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.
 

 

Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 

 

Sample Input
   
   
   
   
banana band bee absolute acm ba b band abc
 

 

Sample Output
   
   
   
   
2 3 1 0
 

 

Author
Ignatius.L
 

 

Recommend
Ignatius.L
#include<cstdio> #include<cstring> #include<stdlib.h> struct dictree { int child[26];/*假设只有26个字符*/ int n;/*记录当前单词出现的次数*/ }tree[1000010]; int root; int nownode=0; void insert(char *source) { int len,i,j; int current,newnode; len=strlen(source); if(len==0) return; current=root;//从根节点开始寻找 for(i=0; i<len; i++)/*逐个插入字符*/ { if(tree[current].child[source[i]-'a']!=-1)/*存在*/ { current=tree[current].child[source[i]-'a']; tree[current].n=tree[current].n+1; } else { ++nownode;//看现在第几个node还未被使用 newnode=nownode; for(j=0; j<26; j++) tree[newnode].child[j]=-1;//初始化 tree[current].child[source[i]-'a']=newnode; current=newnode; tree[current].n=1;//从这个开始的字符串只有一个 } } } int find(char *source) { int i,len; int current; len=strlen(source); if(len==0) return 0; current=root; for(i=0; i<len; i++) { if(tree[current].child[source[i]-'a']!=-1) current=tree[current].child[source[i]-'a']; else return 0;/*还没比较完就出现不匹配, 字典树中没有此单词*/ } return tree[current].n;/*此单词出现的次数*/ } int main() { char temp[11]; int i; root=0; nownode=0; for(i=0; i<26; i++) tree[root].child[i]=-1;//初始化 tree[root].n=0; while(gets(temp),strcmp(temp,"")!=0)//遇到空行则表示字母表输入完毕 insert(temp); while(scanf("%s",temp)!=EOF) { i=find(temp);//查询,i统计有多少个以temp为前缀的字符串 printf("%d/n",i); } return 0; }

你可能感兴趣的:(tree,测试,insert,output)