easy or puzzle ? 字典树
2012-03-27 21:09 璋廊 阅读(1043) 评论(0) 编辑 收藏 举报Description
Laoda最近遇到一个难题,老师交给他很多单词(只有小写字母组成),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Laoda统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input
banana
band
bee
absolute
acm
ba
b
band
abc
Sample Output
2 3 1 0
#include<stdio.h> #include<string.h> #include<stdlib.h> struct point//建立结构体 { int count ; struct point *s[26];//结构体指针; }; struct point *head; void bulit(char *str)//建立字典树 { int k,i,j; point *p,*h; k=strlen(str); if(k==0) return ; h=head; for(i=0;i<k;i++) { if(h->s[str[i]-'a']==0)//如果此节点没有建立过 { p=(point*)malloc(sizeof(point)); for(j=0;j<26;j++) p->s[j]=0; h->s[str[i]-'a']=p; h=p; h->count=1; } else { h=h->s[str[i]-'a']; h->count=h->count+1; } } } int find (char *str)//查找字典; { int i,len; struct point *h; len=strlen(str); if(len==0) return 0; h=head; for(i=0;i<len;i++) { if(h->s[str[i]-'a']!=0) h=h->s[str[i]-'a']; else return 0; } return h->count; } int main() { char str[11]; head=(point*)malloc(sizeof(point)); int i; for(i=0;i<26;i++) head->s[i]=0; head->count=0; while(gets(str),strcmp(str,"")!=0) { bulit(str); } while(scanf("%s",str)!=-1) { int n=find(str); printf("%d\n",n); } return 0; }