<span>hdu-1251 统计难题</span>

传送门

Problem Description

Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
 
Input
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
 
Output
对于每个提问,给出以该字符串为前缀的单词的数量.
 
Sample Input
banana
band
bee
absolute
 
 
acm
ba
b
band
abc
 
Sample Output
2
3
1
0
 
题解:简单的字典树,建树的时候用color数组标记每个前缀出现了多少次,查询的时候只要看color就行;输入空行开始查询可以用gets() 实现,读入字符串然后判断长度是否为0;
 
 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 
 4 char a[100];
 5 int tree[400100][30];
 6 int color[400100];
 7 int k=1;
 8 
 9 void insert()
10 {
11     int p=0;
12     int len=strlen(a);
13     for(int i=0;i<len;i++){
14         int c=a[i]-'a';
15         if(!tree[p][c]) {
16             tree[p][c]=k;
17             k++;
18         }
19         p=tree[p][c];
20         color[p]++;
21     }
22 }
23 
24 int query()
25 {
26     int p=0;
27     int len=strlen(a);
28     for(int i=0;i<len;i++){
29         int c=a[i]-'a';
30         if(!tree[p][c]) return 0;
31         p=tree[p][c];
32     }
33     return color[p];
34 }
35 
36 int main()
37 {
38     while(gets(a)){
39         if(strlen(a)==0) break;
40         insert();
41     }
42     while(gets(a)){
43         if(strlen(a)==0) break;
44         printf("%d\n",query());
45     }
46     return 0;
47 }

 

全部评论

相关推荐

杨柳哥:这不是普通人,那这个钱的是天才
点赞 评论 收藏
分享
ProMonkey2024:5个oc?厉害! 但是有一个小问题:谁问你了?😡我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了(别的帖子偷来的,现学现卖😋)
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务