博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1251 统计难题(字典树)
阅读量:6994 次
发布时间:2019-06-27

本文共 2809 字,大约阅读时间需要 9 分钟。

统计难题

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
#define MAX 26typedef 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
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
#include
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
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
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;}

 

转载地址:http://shfvl.baihongyu.com/

你可能感兴趣的文章
iOS开发规范&建议
查看>>
[原]如何为SqlServer2008数据库分配用户
查看>>
【leetcode】Basic Calculator III
查看>>
关于CCS中一些错误的解决方法
查看>>
回归到jquery
查看>>
安卓截屏如何实现将摄像头显示画面截下来
查看>>
jquery常识
查看>>
EF中的MySql返回 DataTable公共类库
查看>>
Visual Studio 2008常见问题
查看>>
【洛谷 P4254】 [JSOI2008]Blue Mary开公司(李超线段树)
查看>>
scrapy初体验 - 安装遇到的坑及第一个范例
查看>>
OC内存管理
查看>>
C#中Split用法
查看>>
3月6日 c#语言
查看>>
[LeetCode] Surrounded Regions, Solution
查看>>
MySQL系列:数据库基本操作(1)
查看>>
cpu真实核数
查看>>
hdu1058(dp)
查看>>
android EditText与TextView几个常用的属性
查看>>
SDN第五次上机作业
查看>>