HDOJ1251 统计难题 字典树的应用统计一组字符串中某前缀出现次数(字典树第一类应用),

统计难题

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


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 /* 功能Function Description:     HDOJ-1251 字典树
 2    开发环境Environment:          DEV C++ 4.9.9.1
 3    技术特点Technique:
 4    版本Version:
 5    作者Author:                   可笑痴狂
 6    日期Date:                      20120809
 7    备注Notes:
 8 */
 9 
10 #include<stdio.h>
11 #include<string.h>
12 
13 typedef struct node
14 {
15     int num;
16     struct node *next[26];
17 }node;
18 
19 node *T;
20 node memory[1000000];//这里都用数组分配结点,用malloc分配太慢了,然后将内存一次赋给指针
21 int k=0;      //指向未分配内存的数组下标
22 
23 void insert(char *s)
24 {
25     int i,j,len,id;
26     node *p,*q;
27     p=T;
28     len=strlen(s);
29     for(i=0;i<len;++i)
30     {
31         id=s[i]-'a';
32         if(p->next[id]==NULL)
33         {
34             q=&memory[k++];
35             q->num=0;
36             for(j=0;j<26;++j)
37                 q->next[j]=NULL;
38             p->next[id]=q;
39         }
40         p=p->next[id];
41         ++(p->num);
42     }
43 }
44 
45 int search(char *s)
46 {
47     int len,i,id;
48     node *p;
49     len=strlen(s);
50     p=T;
51     for(i=0;i<len;++i)
52     {
53         id=s[i]-'a';
54         if(p->next[id]==NULL)
55             return 0;
56         p=p->next[id];
57     }
58     return p->num;
59 }
60 
61 int main()
62 {
63     int i;
64     char s[15];
65     T=&memory[k++];       //获取数组中的内存
66     for(i=0;i<26;++i)     //头指针初始化
67         T->next[i]=NULL;
68     while(gets(s)&&s[0]!='\0')  //注意这里用scanf的话输出空行时跳不出循环,必须使用gets
69     {
70         insert(s);
71     }
72     while(scanf("%s",s)!=EOF)
73         printf("%d\n",search(s));
74     return 0;
75 }
功不成,身已退
原文地址:https://www.cnblogs.com/dongsheng/p/2630552.html