統計難題
阿新 • • 發佈:2017-05-06
一個 ret 結點 整理 當前 length urn div pre
OJ題號:HDU1251
思路:
Trie,插入時新增一個附加值cnt記錄經過當前結點的字符串個數,每插入一個字符串時就將每個結點+1。 每次詢問時,如果遇到不存在的結點,就說明沒有以該字符串為前綴的字符串,直接跳出。 如果找到了當前字符串的末尾結點,就將當前結點的cnt值累加到ans中。
1 #define maxnode 1000000 2 #define maxlength 10+1 3 #define sigma_size 26 4 #include<cstdio> 5 #include<cstring> 6 int ans; 7 struct Trie {8 int ch[maxnode][sigma_size]; 9 int val[maxnode],cnt[maxnode]; 10 int sz; 11 int idx(char c) { 12 return c-‘a‘; 13 } 14 Trie() { 15 sz=1; 16 memset(ch[0],0,sizeof(ch[0])); 17 } 18 void insert(char *s) { 19 int u=0,n=strlen(s); 20 for(int i=0;i<n;i++) { 21 int c=idx(s[i]); 22 if(!ch[u][c]) { 23 memset(ch[sz],0,sizeof(ch[sz])); 24 cnt[sz]=val[sz]=0; 25 ch[u][c]=sz++; 26 } 27 u=ch[u][c]; 28 cnt[u]++; 29 } 30 val[u]=1; 31 } 32 void ask(char *s) { 33 int u=0,n=strlen(s); 34 for(int i=0;i<n;i++) { 35 int c=idx(s[i]); 36 if(!ch[u][c]) { 37 return; 38 } 39 u=ch[u][c]; 40 } 41 ans+=cnt[u]; 42 } 43 }; 44 Trie trie; 45 int main() { 46 char s[maxlength]; 47 while(gets(s)) { 48 if(!s[0]) break; 49 trie.insert(s); 50 } 51 while(gets(s)!=NULL) { 52 ans=0; 53 trie.ask(s); 54 printf("%d\n",ans); 55 } 56 return 0; 57 }
註:本隨筆整理自QQ空間舊文。發布時間為2017年3月14日。
查看原文
統計難題