洛谷 UVA10226 Hardwood Species

洛谷 UVA10226 Hardwood Species

洛谷评测传送门

题目描述

PDF

img

输入格式

img

输出格式

img

输入输出样例

输入 #1复制

输出 #1复制

题目翻译:

给定若干字符串,输出格式为:(按字典序)给出的字符串+这个字符串出现次数在给定字符串总数之中的占比。

注意:多组数据。

题解:

介绍三种东西:

第一种——字符串忽略空格只考虑回车的输入方式。

第二种——(C++\,\,STL\,\,map)容器。

第三种——字典树。

第一种:

字符串忽略空格只考虑回车的输入方式。

代码如下:

getline(cin,s);

(具体的使用方法可以去网上看,但是讲的都过于繁琐,各种流什么玩意的专业术语根本看不懂(可能是蒟蒻太弱了)),我个人认为大家只需要记住这个玩意的格式就可以。

这里的s指代的是(C++STL)中的(string)容器。如果有对这个容器还不是很了解的小伙伴,请移步本蒟蒻的这篇博客:

浅谈C++ STL string容器

第二种:

map容器。

如果有对map容器不是很熟悉的小伙伴请参考本蒟蒻的这篇博客:

详解C++ STL 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;
}
原文地址:https://www.cnblogs.com/fusiwei/p/11973229.html