洛谷 UVA10226 Hardwood Species
题目描述
输入格式
输出格式
输入输出样例
输入 #1复制
输出 #1复制
题目翻译:
给定若干字符串,输出格式为:(按字典序)给出的字符串+这个字符串出现次数在给定字符串总数之中的占比。
注意:多组数据。
题解:
介绍三种东西:
第一种——字符串忽略空格只考虑回车的输入方式。
第二种——(C++\,\,STL\,\,map)容器。
第三种——字典树。
第一种:
字符串忽略空格只考虑回车的输入方式。
代码如下:
getline(cin,s);
(具体的使用方法可以去网上看,但是讲的都过于繁琐,各种流什么玩意的专业术语根本看不懂(可能是蒟蒻太弱了)),我个人认为大家只需要记住这个玩意的格式就可以。
这里的s指代的是(C++STL)中的(string)容器。如果有对这个容器还不是很了解的小伙伴,请移步本蒟蒻的这篇博客:
第二种:
map容器。
如果有对map容器不是很熟悉的小伙伴请参考本蒟蒻的这篇博客:
第三种:
字典树。
如果有对字典树还不是很了解的小伙伴请参考本蒟蒻的这篇博客:
好了,我们现在来说思路:
题目让我们统计字符串出现的次数,那么我们很容易想到(map)所构建的这种映射关系,建立一个(map)构建由(string)到(int)的一个映射就可以方便的统计这些信息。
最令人舒适的是,(map)自带的第一关键字排序正好支持(string)的字典序操作。简直不要太舒服!
于是得出了一份超短AC代码:
注:需要注意很多细节,多组数据很恶心,卡换行卡多换行,一定要仔细比照自己的代码和下面的程序到底一不一样。
#include<cstdio>
#include<map>
#include<iostream>
#include<string>
using namespace std;
int t,tot;
string s;
map<string,int> mp;
map<string,int>::iterator it;
int main()
{
scanf("%d
",&t);
while(t--)
{
tot=0;
mp.clear();
while(1)
{
getline(cin,s);
if(s[0]==' ')
break;
tot++;
mp[s]++;
}
for(it=mp.begin();it!=mp.end();it++)
{
double ans=(it->second)*100.0/tot;
printf("%s %.4lf
",it->first.c_str(),ans);
}
if(t)
puts("");
}
return 0;
}