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 ",dic.check(a)); 84 } 85 }