hdu 1251:统计难题(字典树,经典题)
统计难题
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)
Total Submission(s): 16905 Accepted Submission(s): 7273
注意:本题只有一组测试数据,处理到文件结束.
#include <iostream>
#include <string.h>
using namespace std; struct Trie{ //字典树定义
Trie* next[];
int num; //以当前字符串为前缀的单词的数量
Trie() //构造函数
{
int i;
for(i=;i<;i++){
next[i] = NULL;
}
num=;
}
};
Trie root;
void Insert(char word[]) //将字符串word插入到字典树中
{
Trie *p = &root;
int i;
for(i=;word[i];i++){ //遍历word的每一个字符
if(p->next[word[i]-'a']==NULL) //如果该字符没有对应的节点
p->next[word[i]-'a'] = new Trie; //创建一个
p = p->next[word[i]-'a'];
p->num++;
}
}
int Find(char word[]) //返回以字符串word为前缀的单词的数量
{
Trie *p = &root;
int i;
for(i=;word[i];i++){ //在字典树找到该单词的结尾位置
if(p->next[word[i]-'a']==NULL)
return ;
p = p->next[word[i]-'a'];
}
return p->num;
} int main()
{
char word[];
while(cin.getline(word,)){ //输入单词
if(strlen(word)== || word[]==' ') //如果读入字符串的长度为0或者是空格,说明读入的是空行
break;
Insert(word);
}
while(scanf("%s",word)!=EOF){
printf("%d\n",Find(word)); //返回word为前缀的单词的数量
}
return ;
}
代码二(数组):
#include <iostream>
#include <stdio.h>
using namespace std; int trie[][]; //数组形式定义字典树,值存储的是下一个字符的位置
int num[]={}; //附加值,以某一字符串为前缀的单词的数量
int pos = ; void Insert(char word[]) //在字典树中插入某个单词
{
int i;
int c = ;
for(i=;word[i];i++){
int n = word[i]-'a';
if(trie[c][n]==) //如果对应字符还没有值
trie[c][n] = pos++;
c = trie[c][n];
num[c]++;
}
}
int Find(char word[]) //返回以某个字符串为前缀的单词的数量
{
int i;
int c = ;
for(i=;word[i];i++){
int n = word[i]-'a';
if(trie[c][n]==)
return ;
c = trie[c][n];
}
return num[c];
} int main()
{
char word[];
while(gets(word)){
if(word[]==NULL) //空行。gets读入的回车符会自动转换为NULL。
break;
Insert(word);
}
while(gets(word))
printf("%d\n",Find(word));
return ;
}
SUM:
以下是2种做法的效率对比:
第二行的是第一种做法,第一行的是第二种做法,很明显,数组做法不管是在时间,空间,代码量上都要优于链表做法。
但是数组的不太好理解,如何取舍看各位看官的意思吧。
Freecode : www.cnblogs.com/yym2013
hdu 1251:统计难题(字典树,经典题)的更多相关文章
- hdu 1251 统计难题 (字典树入门题)
/******************************************************* 题目: 统计难题 (hdu 1251) 链接: http://acm.hdu.edu. ...
- hdu 1251 统计难题 字典树第一题。
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- HDU 1251 统计难题 字典树大水题
今天刚看的字典树, 就RE了一发, 字典树原理还是很简单的, 唯一的问题就是不知道一维够不够用, 就开的贼大, 这真的是容易MLE的东西啊, 赶紧去学优化吧. HDU-1251 统计难题 这道题唯一的 ...
- hdu -1251 统计难题(字典树水题)
http://acm.hdu.edu.cn/showproblem.php?pid=1251 建树之后 查询即可. G++提交 ME不知道为什么,c++就对了. #include <iostre ...
- HDOJ/HDU 1251 统计难题(字典树啥的~Map水过)
Problem Description Ignatius最近遇到一个难题,老师交给他很多单词(只有小写字母组成,不会有重复的单词出现),现在老师要他统计出以某个字符串为前缀的单词数量(单词本身也是自己 ...
- hdu 1251 统计难题(字典树)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Subm ...
- hdu 1251 统计难题 (字典树(Trie)<PS:C++提交不得爆内存>)
统计难题Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submis ...
- HDU 1251 统计难题(字典树)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others)Total Submi ...
- HDU 1251统计难题 字典树
字典树的应用. 数据结构第一次课的作业竟然就需要用到树了!!!这不科学啊.赶紧来熟悉一下字典树. 空间开销太大T T #include<cstdio> #include<cstrin ...
- HDU 1251 统计难题(Trie模版题)
统计难题 Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 131070/65535 K (Java/Others) Total Subm ...
随机推荐
- 9.10---堆箱子问题(CC150)
1,牛客网的解题思路:其实这就是求一个最长的递增子序列. 以某一个箱子结尾的最大高度=放在它上面的所有类型中高度最大的那个+他自己的高度. import java.util.*; public c ...
- Tomcat部署Web应用的两种方式
WEB工程目录结构 部署方式一:此种方式部署,jsp页面修改后,不能动态更新,需要重新部署才能看到效果.不过可以配置动态更新实现. 部署方式二:此种方式部署,jsp修改后,直接在页面可以看到效果.(因 ...
- LUA require 搜索路径指定方法
如果是一个 *.LUA 的文件, 里面用到了自己写的库, 或者第三方写的库, 但是你不想把它放到 lua 的安装目录里, 则在代码里面可以指定require搜索的路径. package.path = ...
- Linux Vsftpd 连接超时解决方法
Linux Vsftpd 连接超时解决方法 2013-11-13 10:58:34| 分类: 默认分类|举报|字号 订阅 解决方法(http://www.lingdus.com/thread ...
- Oracle 级联删除
alter table ForeignTable(附表)add constraint fk_MainTable_ForeignTable(关联表中的外键) foreign key(ForeignTab ...
- 用extern定义全局变量
1.extern的作用 extern有两个作用,第一个,当它与"C"一起连用时,如: extern "C" void fun(int a, int b); 则告 ...
- Qt 文件处理
1.删除目录下所有的文件 void deleteAllFiles(const QString& fileDir) { QDir dir(fileDir); if(!dir.exists()) ...
- C Primer Plus_第四章_字符串和格式化输入输出_编程练习
Practice 1.输入名字和姓氏,以"名字,姓氏"的格式输出打印. #include int main(void) { char name[20]; char family[2 ...
- win7 ubuntu10.04双系统,重装win7后,修复双启动项
进入ubuntu的liveCD(即在试用ubuntu里),在终端里操作 首先要找到自己的ubuntu系统挂载在那个sda下面.可以用sudo fdisk -l 这个命令.然后: 1. sudo -i ...
- js生成验证码并验证
前台代码: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="Default.as ...