Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 26574 Accepted Submission(s): 10760
【思路】
Trie。
构建一棵字典树,并维护tot[u]表示以u为根的子数中叶子节点的数目。
需要注意的是maxnode要开大一些。
【代码】
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define FOR(a,b,c) for(int a=(b);a<=(c);a++) 5 using namespace std; 6 7 const int maxnode = 2000000; 8 //输入的字符串可能很多 9 const int maxl = 15; 10 const int sigmasize = 26; 11 12 struct Trie{ 13 int ch[maxnode][sigmasize]; 14 int tot[maxnode]; 15 int sz; 16 17 Trie() { 18 sz=1; 19 memset(ch[0],0,sizeof(ch[0])); 20 tot[0]=0; 21 } 22 int idx(char c) { return c-‘a‘; } 23 void insert(char* s) { 24 int n=strlen(s),u=0; 25 for(int i=0;i<n;i++) { 26 int c=idx(s[i]); 27 if(!ch[u][c]) { 28 ch[u][c]=sz; 29 memset(ch[sz],0,sizeof(ch[sz])); 30 tot[sz]=0; 31 sz++; 32 } 33 u=ch[u][c]; 34 tot[u]++; 35 } 36 } 37 int find(char* s) { 38 int n=strlen(s),u=0; 39 for(int i=0;i<n;i++) { 40 int c=idx(s[i]); 41 if(!ch[u][c]) return 0; 42 else u=ch[u][c]; 43 } 44 return tot[u]; 45 } 46 }trie; 47 48 int n; 49 50 int main() { 51 //freopen("cin.in","r",stdin); 52 //freopen("coutme.out","w",stdout); 53 char s[maxl]; 54 while(gets(s) && s[0]) { 55 trie.insert(s); 56 } 57 while(gets(s)) { 58 printf("%d\n",trie.find(s)); 59 } 60 return 0; 61 }
原文:http://www.cnblogs.com/lidaxin/p/4985428.html