很棒 HDU 1251 (字典树)
2015-06-04 17:17
399 查看
分析:一道简单的字典树的题目,一开始用G++提交总是MLE ,尝试再写个释放内存的函数,竟然比原先的内存占用更大了。很无语。。。。后来改用C++提交竟然减少了一半内存,而且AC了。!!
代码2:
Total Submission(s): 21634 Accepted Submission(s): 9249
[align=left]Problem Description[/align]
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
[align=left]Input[/align]
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
[align=left]Output[/align]
对于每个提问,给出以该字符串为前缀的单词的数量.
[align=left]Sample Input[/align]
[align=left]Sample Output[/align]
[align=left]Author[/align]
Ignatius.L
#include <stdio.h> #include <string.h> #include <stdlib.h> #define MAX 50021 typedef struct trie { trie *next[26]; int v; //字符相同的个数 }trie; trie *root; void creat_trie(char str[]) { int len = strlen(str); trie *p = root; for(int i=0; i<len; ++i) { int id = str[i]-'a'; if(p->next[id] == NULL) { p->next[id] = (trie *)malloc(sizeof(trie)); p->next[id]->v = 1; p = p->next[id]; for(int j=0; j<26; ++j) p->next[j] = NULL; } else { p->next[id]->v++; p = p->next[id]; } } } int find_trie(char str[]) { int len = strlen(str); trie *pp = root; for (int i=0;i<len;i++) { int id = str[i] - 'a'; pp = pp->next[id]; if(pp == NULL) return 0; //没有符合 } return pp->v; // 此字符串为字符集中某串的前缀 } int main() { int N,n,i,j,s,t,m,flag=0; int a,b,c,d; int sum; char str[15]; root = (trie *)malloc(sizeof(trie)); for (i=0;i<26;i++) { root->next[i] = NULL; } while (gets(str) && str[0] != 0) { creat_trie(str); } while (scanf("%s",str) != EOF) { int k=find_trie(str); printf("%d\n",k); } //deal(root); return 0; }
代码2:
#include <cstdio> #include <cstring> #include <iostream> using namespace std; struct trie { trie *next[26]; int v; //字符相同的个数 trie() { memset(next,NULL,sizeof(next)); v=0; } }; trie *root=new trie(),*p; void creat_trie(char *str) { int i,id; for(p = root,i=0;str[i]; ++i) { id = str[i]-'a'; if(p->next[id] == NULL) { p->next[id] = new trie(); } p = p->next[id]; p->v++; } } int find_trie(char *str) { int i,id; for (p=root,i=0;str[i];i++) { id = str[i] - 'a'; p = p->next[id]; if(p == NULL) return 0; } return p->v; // 此字符串为字符集中某串的前缀 } int main() { int N,n,i,j,s,t,m,flag=0; int a,b,c,d; int sum; char str[15]; while (gets(str),*str) { creat_trie(str); } while (gets(str)) { printf("%d\n",find_trie(str)); } return 0; }
统计难题
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submission(s): 21634 Accepted Submission(s): 9249
[align=left]Problem Description[/align]
Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己的前缀).
[align=left]Input[/align]
输入数据的第一部分是一张单词表,每行一个单词,单词的长度不超过10,它们代表的是老师交给Ignatius统计的单词,一个空行代表单词表的结束.第二部分是一连串的提问,每行一个提问,每个提问都是一个字符串.
注意:本题只有一组测试数据,处理到文件结束.
[align=left]Output[/align]
对于每个提问,给出以该字符串为前缀的单词的数量.
[align=left]Sample Input[/align]
banana band bee absolute acm ba b band abc
[align=left]Sample Output[/align]
2 3 1 0
[align=left]Author[/align]
Ignatius.L
相关文章推荐
- Gradle学习系列之二——创建Task的多种方法
- SVN 冲突解决办法
- Mac上使用命令行安装brew,并通过brew安装Ant等工具
- Spark-streaming-scheduler
- Spark-streaming-杂
- Android笔记三十三.BroadcastReceiver使用
- 用rand()和srand()产生伪随机数的方法总结 【转】
- 如何让在JAVA中定义常量池
- 平级控件拖线
- once
- sun.misc.BASE64Encoder找不到jar包的解决方法
- 2013年SAT真题精选
- 加速Java应用开发速度3——单元/集成测试+CI
- ExecuteSQL Command for ArcMap
- Android中linux内核模块--开发设备驱动程序 && 上层接口实施
- 一张图让你了解足球赛和网络安全的关系!
- Gradle学习系列之一——Gradle快速入门
- jdbc连接数据库,查询条件为汉字,查询无结果解决办法
- 如何提高页面的显示速度
- Html_color code表示