HDU --1251

统计难题

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


Problem Description
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.

注意:本题只有一组测试数据,处理到文件结束.
 
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 
Sample Input
banana
band
bee
absolute
acm
 
ba
b
band
abc
 
Sample Output
2
3
1
0
 
思路:Trie树,很早以前写过,但代码写的太屎,今天做别人比赛遇到了,就重写了一次。
 
 1 #include<cstdio>
 2 #include<string>
 3 #include<cstdio>
 4 #include<cstring>
 5 #include<iostream>
 6 #include<algorithm>
 7 using namespace std;
 8 class Node{
 9     public:
10         int cnt;
11         Node *child[26];
12         Node(){
13             cnt  =0;
14             for(int i = 0;i < 26;i ++)
15                 child[i] = NULL;
16         }
17 };
18 Node *root = new Node();
19 void Update(char *str){
20     Node *tmp = root;
21     while(*str != ''){
22         if(tmp->child[*str - 'a'] == NULL){
23             Node *p = new Node();
24             tmp->child[*str - 'a'] = p;
25         }
26         tmp = tmp->child[*str - 'a'];
27         tmp->cnt++;
28         str++;
29     }
30 }
31 int Getresult(char *str){
32     Node *tmp = root;
33     while(*str != ''){
34         if(tmp->child[*str - 'a'] == NULL) return 0;
35         tmp = tmp->child[*str - 'a'];
36         str++;
37     }
38     return tmp->cnt;
39 }
40 int main(){
41     char str[20];
42     while(cin.getline(str,20) && strcmp(str,"")) Update(str);
43     while(~scanf("%s",str)) printf("%d
",Getresult(str));
44     return 0;
45 }
原文地址:https://www.cnblogs.com/anhuizhiye/p/3676616.html