hdu 1251 统计难题 字典树第一题。

统计难题

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


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

 

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

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

 

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

 

Sample Input
banana
band
bee
absolute
acm
 
ba
b
band
abc
 

 

Sample Output
2
3
1
0
 
 1 /*

 2 字典树的模板题。

 3 */

 4 #include<iostream>

 5 #include<stdio.h>

 6 #include<cstring>

 7 #include<cstdlib>

 8 #include<algorithm>

 9 using namespace std;

10 

11 struct Tril

12 {

13     struct Tril *next[26];

14     int v;

15 };

16 Tril *root;

17 

18 void mem(Tril *p)

19 {

20     int i;

21     p->v=1;

22     for(i=0;i<26;i++)

23         p->next[i]=NULL;

24 }

25 void insert_Tril(char *c)

26 {

27     int i,len;

28     Tril *p,*q;

29     p=root;

30     len=strlen(c+1);

31     for(i=1;i<=len;i++)

32     {

33         if(p->next[c[i]-'a']==NULL)

34         {

35             q=(Tril*)malloc(sizeof(Tril));

36             mem(q);

37             p->next[c[i]-'a']=q;

38             p=q;

39         }

40         else

41         {

42             p=p->next[c[i]-'a'];

43             p->v++;

44         }

45     }

46 }

47 int found_Tril(char *c)

48 {

49     int len,i;

50     Tril *p=root;

51     len=strlen(c+1);

52     for(i=1;i<=len;i++)

53     {

54         if(p->next[c[i]-'a']==NULL)

55             return 0;

56         p=p->next[c[i]-'a'];

57     }

58     return p->v;

59 }

60 void deal_Tril(Tril *p)

61 {

62     int i;

63     for(i=0;i<26;i++)

64     {

65         if(p->next[i]==NULL)

66         {

67             free(p);

68             continue;

69         }

70         else

71             deal_Tril(p->next[i]);

72     }

73 }

74 int main()

75 {

76     char a[50];

77     int n;

78     root= (Tril*)malloc(sizeof(Tril));

79     mem(root);

80     while(gets(a+1))

81     {

82         insert_Tril(a);

83         while(gets(a+1))

84         {

85             n=strlen(a+1);

86             if(n==0) break;

87             insert_Tril(a);

88         }

89         while(gets(a+1))

90         {

91             printf("%d\n",found_Tril(a));

92         }

93     }

94     return 0;

95 }

 

你可能感兴趣的:(HDU)