首页 > 代码库 > (trie)HDU1251 统计难题

(trie)HDU1251 统计难题

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

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

注意:本题只有一组测试数据,处理到文件结束. 
Output对于每个提问,给出以该字符串为前缀的单词的数量. 
Sample Input

banana
band
bee
absolute
acm

ba
b
band
abc

Sample Output

2
3
1
0

完完全全的trie裸题,不过要注意数组(或map)的大小,防止MLE。

 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 #include <cstring>
 5 #include <cstdio>
 6 #include <cmath>
 7 #include <queue>
 8 #include <set>
 9 #include <map>
10 #include <list>
11 #include <vector>
12 #include <stack>
13 #define mp make_pair
14 //#define P make_pair
15 #define MIN(a,b) (a>b?b:a)
16 //#define MAX(a,b) (a>b?a:b)
17 typedef long long ll;
18 typedef unsigned long long ull;
19 const int MAX=1e6+5;
20 const int MAX_V=1e3+5;
21 const ll INF=4e18+5;
22 const double M=4e18;
23 using namespace std;
24 const int MOD=1e9+7;
25 typedef pair<ll,int> pii;
26 const double eps=0.000000001;
27 #define rank rankk
28 map<int,int>ch[MAX];
29 int val[MAX];
30 struct Trie
31 {
32     int num;
33     Trie(){num=1;}
34     int idx(char x)
35     {
36         return x-a;
37     }
38     void clear()
39     {
40         num=1;
41     }
42     void insert(char *s)
43     {
44         int u=0,len=strlen(s);
45         for(int i=0;i<len;i++)
46         {
47             int c=idx(s[i]);
48             if(!ch[u][c])
49             {
50                 val[num]=0;
51                 ch[u][c]=num++;
52             }
53             u=ch[u][c];
54             ++val[u];
55         }
56     }
57     int check(char *s)
58     {
59         int u=0,len=strlen(s);
60         for(int i=0;i<len;i++)
61         {
62             int c=idx(s[i]);
63             if(!ch[u][c])
64                 return 0;
65             u=ch[u][c];
66         }
67         return val[u];
68     }
69 };
70 char a[300];
71 int main()
72 {
73     Trie dic;
74     while(1)
75     {
76         gets(a);
77         if(strlen(a)==0)
78             break;
79         dic.insert(a);
80     }
81     while(scanf("%s",a)!=EOF)
82     {
83         printf("%d\n",dic.check(a));
84     }
85 }

 

(trie)HDU1251 统计难题