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
",found_Tril(a));
92         }
93     }
94     return 0;
95 }
原文地址:https://www.cnblogs.com/tom987690183/p/3567905.html