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

E - 统计难题

时间:2016-08-15 22:22:44      阅读:188      评论:0      收藏:0      [点我收藏+]

标签:

E - 统计难题

Time Limit:2000MS     Memory Limit:65535KB     64bit IO Format:%I64d & %I64u

Description

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀). 

Input

输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串. 

注意:本题只有一组测试数据,处理到文件结束. 

Output

对于每个提问,给出以该字符串为前缀的单词的数量. 

Sample Input

banana
band
bee
absolute
acm

ba
b
band
abc

Sample Output

2
3
1
0

//美名字典树,没见过,自己捣鼓了一下午,超内存了。提交用 G++ 就超内存,C++ 不超。。。然后 wrong anser 原因在于输入,
不知道为什么,如下输入是对的。
技术分享
 1 int main()
 2 {
 3     char str[30];
 4     while(gets(str)&&str[0])
 5     {
 6         build(str);
 7     }
 8     while(gets(str))
 9     {
10         printf("%d\n",querry(str));
11     }
12     return 0;
13 }
View Code
而我的,是错的,反正运行起来是没错的。
技术分享
 1 int main()
 2 {
 3     char xxx;
 4     int len;
 5     while (xxx=getchar())
 6     {
 7         if (xxx==\n) break;
 8         str[0]=xxx;
 9         scanf("%s",str+1);
10         len=strlen(len);
11         build(len);
12         xxx=getchar();
13     }
14     while (scanf("%s",&str)!=EOF)
15     {
16         len=strlen(str);
17         printf("%d\n",find(len));
18     }
19 return 0;
20 }
View Code
好了,给AC代码,先给个别人的 124ms
技术分享
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <iostream>
 4 using namespace std;
 5 struct node
 6 {
 7     int num;
 8     node* next[26];
 9     node()
10     {
11         num=0;
12         memset(next,NULL,sizeof(next));
13     }
14 };
15 node* root=new node();
16 node* rt;
17 int id,len;
18 
19 void build(char str[30])
20 {
21     rt=root;
22     len=strlen(str);
23     for(int i=0;i<len;i++)
24     {
25         id=str[i]-a;
26         if(rt->next[id]==NULL)
27             rt->next[id]=new node();
28         rt=rt->next[id];
29         rt->num++;
30     }
31 }
32 
33 int querry(char str[30])
34 {
35     rt=root;
36     len=strlen(str);
37     for(int i=0;i<len;i++)
38     {
39         id=str[i]-a;
40         if(rt->next[id]==NULL)
41             return 0;
42         rt=rt->next[id];
43     }
44     return rt->num;
45 }
46 int main()
47 {
48     char str[30];
49     while(gets(str)&&str[0])
50     {
51         build(str);
52     }
53     while(gets(str))
54     {
55         printf("%d\n",querry(str));
56     }
57     return 0;
58 }
View Code
我的,注释比较详细,递归建树的要慢一点 202ms
技术分享
 1 #include <stdio.h>
 2 #include <string.h>
 3 #include <math.h>
 4 
 5 struct Node
 6 {
 7     int flag;
 8     struct Node * next[26];
 9     Node()
10     {
11         flag=0;
12         memset(next,NULL,sizeof(next));
13     }
14 };
15 Node * root=new Node();
16 char str[15];
17 
18 struct Node * set(int len,int step,struct Node * k)
19 {
20     if (step+1==len)    k->flag++;//说明到这是个单词
21 
22     if (step+1<len)//如果还有
23     {
24         k->flag++; //记录自己下面还有几个单词
25 
26         if (k->next[str[step+1]-a]==NULL)//如果没有建立过
27         {
28             k->next[str[step+1]-a]=new Node();
29             k->next[str[step+1]-a]=set(len,step+1,k->next[str[step+1]-a]);//继续建设
30         }
31         else
32             set(len,step+1,k->next[str[step+1]-a]);
33     }
34     return k;
35 }
36 
37 int find(int len,int step,struct Node * k)
38 {
39     if (step+1<len)//如果还没到
40     {
41         if (k->next[str[step+1]-a]==NULL)//没有这种单词
42             return 0;
43 
44         return find(len,step+1,k->next[str[step+1]-a]);
45     }
46 
47     return k->flag;
48 }
49 
50 void Del(Node * k)
51 {
52     int i;
53     for (i=0;i<26;i++)
54         if (k->next[i]!=NULL)
55             Del(k->next[i]);
56     delete k;
57 }
58 
59 int main()
60 {
61     int len;
62     while(gets(str)&&str[0])
63     {
64         len=strlen(str);
65         set(len,-1,root);
66     }
67     while(gets(str))
68     {
69         len=strlen(str);
70         printf("%d\n",find(len,-1,root));
71     }
72     Del(root);
73     return 0;
74 }
View Code

 

 
 

 

 



E - 统计难题

标签:

原文地址:http://www.cnblogs.com/haoabcd2010/p/5774413.html

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