码迷,mamicode.com
首页 > 其他好文 > 详细

hdu1251统计难题(trie)

时间:2017-07-05 21:15:45      阅读:206      评论:0      收藏:0      [点我收藏+]

标签:title   max   des   节点   miss   time   print   memset   cep   

统计难题

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


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
 

 

 1 #include<cstdio>
 2 #include<cstring>
 3 const int MAXN = 1000100;
 4 
 5 struct Trie
 6 {
 7     int ch[MAXN][26];
 8     int val[MAXN];
 9     int size;//节点总数
10     void Clear()
11     {
12         size = 1;
13         memset(ch[0],0,sizeof(ch[0]));
14         memset(val,0,sizeof(val));
15     }
16     int idx(char c)
17     {
18         return c - a;   //字符c的编号
19     }
20     void Insert(const char*s)
21     {
22         int u = 0, len = strlen(s);
23         for (int i=0; i<len; ++i)
24         {
25             int c = idx(s[i]);
26             if (!ch[u][c])
27             {
28                 memset(ch[size],0,sizeof(ch[size]));
29                 ch[u][c] = size++;
30             }
31             u = ch[u][c];
32             val[u]++;
33         }
34     }
35     int Find(const char* s)
36     {
37         int u = 0 , len = strlen(s);
38         for (int i=0; i<len-1; ++i)
39         {
40             int c = idx(s[i]);
41             if (!ch[u][c]) return 0 ;
42             u = ch[u][c];
43         }
44         int c = idx(s[len-1]);
45         return val[ch[u][c]] ;
46     }
47 }t;
48 
49 int main()
50 {    
51     char word[15];
52     t.Clear();
53     while (gets(word)&&strcmp(word,""))
54     {
55         t.Insert(word);
56     }
57     while (scanf("%s",word)!=EOF)
58         printf("%d\n",t.Find(word));
59     return 0;
60 }

 

hdu1251统计难题(trie)

标签:title   max   des   节点   miss   time   print   memset   cep   

原文地址:http://www.cnblogs.com/mjtcn/p/7123288.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!