我的错因: 本来改用%f输出,我用了%lf,结果编译器直接判定为错误(一部分编译器认为lf是没有错的)。当时我还以为是hash出错了。。

  方法不止一种:

  方法            时间        空间
  Hash           891ms      596k
  map<string,int>     2735ms      1316k
  sort            5000ms+    30000k+

  %lf 与 %f的具体区别:

  printf的%f说明符的确既可以输出float型又可以输出double型。根据“默认参数提升”规则float型会被提升为double型。因此printf()只会看到双精度数。对于scanf,情况就完全不同了,它接受指针,这里没有类似的类型提升。向float存储和向double存储大不一样,因此,scanf区别%f和%lf。

  也就是说输出的时候不管输出的是双精度还是单精度都用%f就没错了,但是输入的时候,输入单精度要用%f而输入双精度要用%lf。

  哈希

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<sstream>
using namespace std;
struct Tree
{
char name[];
int sum;
} tree[];
int SDBMHash(char *str)
{
int Hash = ;
while(*str)
{
Hash = (*str++) + (Hash << ) + (Hash << ) - Hash;
}
return (Hash&0x7FFFFFFF);
}
bool cmp(Tree a,Tree b)
{
return strcmp(a.name,b.name)<;
}
map<int,int> pos;
int main()
{
// freopen("H.in.cpp","r",stdin);
char tmp[];
pos.clear();
int tot = ,all = ;
while(gets(tmp))
{
if(strcmp(tmp,"") == ) break;
all++;
int H = SDBMHash(tmp);
int id = pos[H];
if(id == )
{
strcpy(tree[++tot].name,tmp);
tree[tot].sum = ;
pos[H] = tot;
}
else
{
tree[id].sum++;
}
}
sort(tree+,tree++tot,cmp);
for(int i = ; i <= tot; i++)
{
printf("%s %.4f\n",tree[i].name,tree[i].sum*100.0/all);
}
return ;
}

  map<string,int>

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<sstream>
using namespace std;
struct Tree
{
string name;
int sum;
} tree[];
bool cmp(Tree a,Tree b)
{
return a.name < b.name;
}
map<string,int> vis;
int main()
{
// freopen("H.in.cpp","r",stdin);
char a[];
string tmp;
vis.clear();
int tot = ,all = ;
while(gets(a))
{
all++;
int len = strlen(a);
tmp = "";
for(int i = ; i < len; i++)
{
tmp += a[i];
}
int id = vis[tmp];
if(id == )
{
tree[++tot].name = tmp;
tree[tot].sum = ;
vis[tmp] = tot;
}
else
{
tree[id].sum++;
}
}
sort(tree+,tree+tot+,cmp);
for(int i = ; i <= tot; i++)
{
cout<<tree[i].name<<" ";
printf("%.4f\n",tree[i].sum*100.0/all);
}
return ;
}

  排序

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<map>
#include<sstream>
using namespace std;
struct Tree
{
char name[];
} tree[];
bool cmp(Tree a,Tree b)
{
return strcmp(a.name,b.name)<;
}
int main()
{
// freopen("H.in.cpp","r",stdin);
int all = ;
while(gets(tree[all].name) && strlen(tree[all].name))
{
all++;
}
sort(tree,tree+all,cmp);
int tot = ;
for(int i = ; i < all; i++)
{
if(strcmp(tree[i].name,tree[i+].name) == ) tot++;
else
{
printf("%s %.4f\n",tree[i].name,tot*100.0/all);
tot = ;
}
}
return ;
}

POJ 2418 Hardwood Species (哈希,%f 和 %lf)的更多相关文章

  1. [字典树] poj 2418 Hardwood Species

    题目链接: id=2418">http://poj.org/problem?id=2418 Hardwood Species Time Limit: 10000MS   Memory ...

  2. POJ 2418 Hardwood Species

                                                     Hardwood Species Time Limit: 10000MS   Memory Limit ...

  3. POJ 2418 Hardwood Species(STL在map应用)

    职务地址:id=2418">POJ 2418 通过这个题查了大量资料..知道了非常多曾经不知道的东西. . .. 在代码中凝视说明吧. 代码例如以下: #include <ios ...

  4. [ACM] POJ 2418 Hardwood Species (Trie树或map)

    Hardwood Species Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 17986   Accepted: 713 ...

  5. poj 2418 Hardwood Species (map)

    题目:http://poj.org/problem?id=2418 在poj 上交题总是有各种错误,再次感叹各个编译器. c++ AC代码,G++为超时,上代码: #include<cstdio ...

  6. POJ - 2418 Hardwood Species(map,trie,BST)

    1.输入若干行树名,输入结束后,按字典序输出树名及其所占百分比. 2.多种方法:map,trie,BST 3. map: #include<iostream> #include<st ...

  7. 二叉搜索树 POJ 2418 Hardwood Species

    题目传送门 题意:输入一大堆字符串,问字典序输出每个字符串占的百分比 分析:二叉搜索树插入,然后中序遍历就是字典序,这里root 被new出来后要指向NULL,RE好几次.这题暴力sort也是可以过的 ...

  8. POJ 2418 Hardwood Species( AVL-Tree )

    #include <stdio.h> #include <stdlib.h> #include <math.h> #include <string.h> ...

  9. POJ 2418 Hardwood Species 【Trie树】

    <题目链接> 题目大意: 给你一堆字符串,让你按字典序输出他们出现的频率. 解题分析: 首先,这是Trie数词频统计的题目,以Trie树的边储存字母,节点存储以该节点结尾的链所代表的字符串 ...

随机推荐

  1. nginx 搭建 文件下载服务

    location / { root /home/data-nginx/; index index.html index.htm; autoindex on; ##显示索引 autoindex_exac ...

  2. SQLServer 重建索引前后对比

    在做维护项目的时,我们经常会遇到索引维护的问题,通过语句,我们就可以判断某个表的索引是否需要重建. 执行一下语句:先分析表的索引 分析表的索引建立情况:DBCC showcontig('Table') ...

  3. 记录下actionbar的翻译

    http://blog.csdn.net/xyz_lmn/article/details/8132420 嗯,actionbarSherLock不错,viewpagerIndicator也不错.

  4. Linux系统VPS/服务器安装WINDOWS桌面环境可以采用的几个方法

    我们公司的几个项目需要在WINDOWS桌面类型的界面操作,哪怕仅有一个浏览器远程操作也是可以的,我们运维部门得到的任务就是需要能在已有的Linux系统的VPS.服务器环境中能够远程操作,至少需要能可以 ...

  5. mongodb部署单节点(一)

    部署包:mongodb-linux-x86_64-rhel55-3.0.2.tgz(百度云盘下载地址:http://pan.baidu.com/s/1jIQAGlw 密码:l7pf) 第一步:上传该文 ...

  6. 2、变量var关键字

    我们在看js声明变量的时候,经常会发现有的变量前会带var 但又的则没有,那么这究竟有什么区别呢? 如果这种情况发生在函数里的话, 加var定义的变量是局部变量,不加var定义的就成了全局变量. // ...

  7. STS中Maven配置

    最近接触maven, 配置过程中记录一下. STS是解压版的,启动后,可以看到已经有了Maven插件, , 但是,STS也同时给你了一个Maven,但是通常不建议使用STS自带的maven.使用默认的 ...

  8. 复习i++和++j

    一,新建一个Default.aspx页面 在Default.aspx.cs

  9. chrome、safari中的input或textarea

    1.去掉chrome.safari input或textarea在得到焦点时出现黄色边框的方法 input{ outline:0;} 2.去掉chrome.safari textarea右下角可拖动鼠 ...

  10. CSS3秘笈复习:第一章&第二章&第三章

    第一章: 1.<cite>标签不仅可以将网页设置为斜体,还能给标题做上标记,使它便于被搜索引擎搜索到. 第二章: 1.import指令链接样式表: CSS本身有一种添加外部样式的方法:@i ...