首页 > 代码库 > 统计难题
统计难题
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日。
查看原文
统计难题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。