HDU 1251 统计难题

D - 统计难题
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
 
爆内存代码
 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<iostream>
 5 #define len strlen(s)
 6 using namespace std;
 7 typedef struct node{
 8     int v;
 9     node *next[26];
10 }node;
11 node root;
12 int build(char *s){
13     node *p=&root,*q;
14     for(int i=0;i<len;i++){
15         int id=s[i]-'a';
16         if(p->next[id]==NULL){
17             q=(node*)malloc(sizeof(root));
18             q->v=1;
19             for(int j=0;j<26;j++)
20                q->next[j]=NULL;
21             p->next[id]=q;
22             p=p->next[id];
23         }
24         else{
25             p->next[id]->v++;
26             p=p->next[id];
27         }
28     }
29 }
30 int findt(char *s){
31     node *p=&root;
32     for(int i=0;i<len;i++){
33         int id=s[i]-'a';
34         p=p->next[id];
35         if(p==NULL) return 0;
36     }
37     return p->v;
38 }
39 int main(){
40     char str[15];
41     for(int i=0;i<26;i++)
42         root.next[i]=NULL;
43     while(gets(str)&&str[0]!='\0')
44        build(str);
45     memset(str,NULL,sizeof str);
46     while(~scanf("%s",str)){
47         int ans=findt(str);
48         printf("%d\n",ans);
49     }
50     return 0;
51 }

 

代码
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<vector>
 5 using namespace std;
 6 vector<string>vec[26];
 7 int cnt,flag=0;int len[26];
 8 string str;
 9 int main()
10 {
11     while(getline(cin,str)){
12         int tmp=str[0]-'a';
13         if(str==""){
14             flag=1;
15             for(int i=0;i<26;i++) len[i]=vec[i].size();
16             continue;
17         }
18         if(!flag) vec[tmp].push_back(str);
19         else{
20             cnt=0;
21           for(int i=0;i<len[tmp];i++){
22             int len2=str.length(),j;
23             for(j=1;j<len2;j++)
24                 if(str[j]!=vec[tmp][i][j]) break;
25                 if(j==len2) cnt++;
26           }
27           printf("%d\n",cnt);
28         }    
29     }
30     return 0;
31 }

 

 

 
posted @ 2016-05-04 21:35  神犇(shenben)  阅读(206)  评论(0)    收藏  举报