1. 程式人生 > >統計難題

統計難題

一個 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日。

查看原文

統計難題