传送门

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 }