统计难题

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

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 #include <iostream>
 2 #include <stdio.h>
 3 #include <algorithm>
 4 #include <string.h>
 5 #include <math.h>
 6 #include <vector>
 7 #include <stack>
 8 #include <map>
 9 using namespace std;
10 #define ll long long int
11 #define INF 5100000
12 typedef struct node
13 {
14     struct node *next[26];
15     int n;
16 }trie;
17 trie *inti()
18 {
19     trie *t;
20     t=(trie *)malloc(sizeof(trie));
21     t->n=0;
22     for(int i=0;i<26;i++) t->next[i]=NULL;
23     return t;
24 }
25 void insert(trie *t,char a[])
26 {
27     t->n++;
28     if(*a=='\0')return ;
29     if(!t->next[*a-'a'])t->next[*a-'a']=inti();
30     insert(t->next[*a-'a'],a+1);
31 }
32 int query(trie *t,char a[])
33 {
34     if(*a==0) return t->n;
35     if(!t->next[*a-'a']) return 0;/*指针为空,未查找到*/
36     return query(t->next[*a-'a'],a+1);
37 }
38 
39 int main()
40 {
41     trie *t;
42     t=inti();
43     char x;
44     x=getchar();
45     char a[100];
46     int r=0;
47     while(x!='\n')
48     {
49         while(x!='\n')
50         {
51             a[r++]=x;
52             x=getchar();
53         }
54         a[r++]='\0';
55         insert(t,a);
56         x=getchar();
57         r=0;
58     }
59    while(scanf("%s",a)!=EOF)
60    {
61        cout<<query(t,a)<<endl;
62    }
63 }
View Code

 

posted on 2013-08-15 09:29  ERKE  阅读(249)  评论(0编辑  收藏  举报