统计难题
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 10295 Accepted Submission(s): 4216
Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
Input 输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
Output 对于每个提问,给出以该字符串为前缀的单词的数量.
Sample Input banana band bee absolute acm ba b band abc
Sample Output 2 3 1 0
Author Ignatius.L
Recommend Ignatius.L 普通的字典树的题目 直接用模板就可以了。
/************ HDU 1251 统计难题 字典树模板 **************/ #include<stdio.h> #define MAX 26 typedef struct TrieNode { int nCount; struct TrieNode *next[MAX]; }TrieNode; TrieNode Memory[1000000]; int allocp=0; void InitTrieRoot(TrieNode **pRoot) { *pRoot=NULL; } TrieNode *CreateTrieNode() { int i; TrieNode *p; p=&Memory[allocp++]; p->nCount=1; for(i=1;i<MAX;i++) { p->next[i]=NULL; } return p; } void InsertTrie(TrieNode **pRoot,char *s) { int i,k; TrieNode *p; if(!(p=*pRoot)) p=*pRoot=CreateTrieNode(); i=0; while(s[i]) { k=s[i++]-'a'; if(p->next[k]) p->next[k]->nCount++; else p->next[k]=CreateTrieNode(); p=p->next[k]; } } int SearchTrie(TrieNode **pRoot,char *s) { TrieNode *p; int i,k; if(!(p=*pRoot)) return 0; i=0; while(s[i]) { k=s[i++]-'a'; if(p->next[k]==NULL) return 0; p=p->next[k]; } return p->nCount; } int main() { char str[11]; TrieNode *Root=NULL; InitTrieRoot(&Root); while(gets(str)&&str[0]) { InsertTrie(&Root,str); } while(gets(str)) { printf("%d\n",SearchTrie(&Root,str)); } return 0; }
再新加一个代码,是动态分配的
看起来也比较容易理解:
#include<stdio.h> #include<string.h> struct Node { struct Node *br[26]; int num; }; Node *head; void Tree_insert(char str[])//插入单词 { Node *t,*s=head; int i,j; int len=strlen(str); for(i=0;i<len;i++) { int id=str[i]-'a'; if(s->br[id]==NULL) { t=new Node; for(j=0;j<26;j++) { t->br[j]=NULL; } t->num=0; s->br[id]=t; } s=s->br[id]; s->num++; } } int Tree_Find(char str[]) { Node *s=head; int count,i; int len=strlen(str); for(i=0;i<len;i++) { int id=str[i]-'a'; if(s->br[id]==NULL) { return 0; } else { s=s->br[id]; count=s->num; } } return count; } int main() { int i; head=new Node; for(i=0;i<26;i++) { head->br[i]=NULL; head->num=0; } char str[12]; while(gets(str)&&str[0]) Tree_insert(str); while(gets(str)) printf("%d\n",Tree_Find(str)); return 0; }