Fellow me on GitHub

HDU1251(字典树)

统计难题

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


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

 

字典树。

交G++不停MLE是什么鬼,交C++才AC。。。

 1 //2016.10.7
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <cstdlib>
 5 #include <cstring>
 6 
 7 using namespace std;
 8 
 9 struct node//26叉树,num为到该节点截止的前缀有多少个
10 {
11     node* ch[26];
12     int num;
13     node(){
14         num = 0;
15         for(int i = 0; i < 26; i++)
16               ch[i] = NULL;
17     }
18 };
19 
20 node *root = NULL;
21 char s[15];
22 
23 void Insert(char *s)
24 {
25     node* cur = root;
26     cur->num++;
27     for(int i = 0; i < strlen(s); i++)
28     {
29         int tmp = s[i]-'a';
30         if(cur->ch[tmp] == NULL)
31               cur->ch[tmp] = new node;
32         cur = cur->ch[tmp];
33         cur->num++;
34     }
35 }
36 
37 int query(char *s)
38 {
39     node *cur = root;
40     for(int i = 0; i < strlen(s); i++)
41     {
42         int tmp = s[i]-'a';
43         if(cur->ch[tmp] == NULL)return 0;
44         cur = cur->ch[tmp];
45     }
46     return cur->num;
47 }
48 
49 int main()
50 {
51     root = new node;
52     while(gets(s), strcmp(s, "")){
53         Insert(s);
54     }
55     while(scanf("%s", s)!=EOF){
56         printf("%d\n", query(s));
57     }
58 
59     return 0;
60 }

 

posted @ 2016-10-07 16:37  Penn000  阅读(358)  评论(0编辑  收藏  举报