1. 程式人生 > >(trie)HDU1251 統計難題

(trie)HDU1251 統計難題

文件 esp 出現 ble nan ont oid 結束 abc

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 統計難題