SDNUOJ 1703.字谜|STL库中map的使用/map映射

题目

Description

输入一些单词,找出所有满足如下条件的单词:该单词不能通过字母重排,得到输入文本的另外一个单词。在判断是否满足条件时,字母不分大小写,但在输出时应保留输入的大小写。满足条件的所有单词按字典序排列。

Input 

输入包含若干单词,随机由空格和回车分割。单词由不超过50个大小写字母组成。保证单词数目不超过1e5个。输入以字符‘#’表示结束

 Output

输出将由一系列行组成。每一行将由一个单词组成,它是输入字典中的一个满足条件的单词。单词必须按字典序(区分大小写)输出。

 Sample Input

ladder came tape soon leader acme RIDE lone Dreis peat
 ScAlE orb  eye  Rides dealer  NotE derail LaCeS  drIed
noel dire Disk mace Rob dries
#

 Sample Output

Disk
NotE
derail
drIed
eye
ladder
soon

分析

我们亲爱的蒋队给新生们找的map模板题!

  • 逐个输入单个单词,忽略空格和回车,请用cin + string
  • 在不分大小写的情况下可以通过字母重排得到彼此的两个单词,他们全部转换为大写(或小写)之后,按字母顺序排序(例如BACK排序后变为ABCK),得到的是同一个字符串(建议停下来多想想!)
  • 单词必须按字典序(区分大小写)输出,但使用map就可以让这个容器自动排序,排序规则和题目一样,所以输出时用一个迭代器顺序输出就可以,无需多虑

我们在判断时,要用到某个单词str经过我们处理后的字符串str2,所以我们应该要有一个map来映射一个单词str和它处理后的字符串str2

map <string, string> word;

最后我们输出满足条件的单词str时,它对应的str2应该只出现了一次,因此我们要创建另一个map来映射str2和它出现的次数

map <string, int> cnt;

基本流程也没有什么难的,单词数量不过1e5,不会卡cin,我们可以大胆地用。

  1. cin 输入单词存入str
  2. 不是 “#” 继续,如果是跳出
  3. 对str进行操作输出为str2
  4. 在word中映射key str的value 为 s
  5. 在cnt中让key str2 的 value++
  6. 重复2 - 6

AC代码

#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;

map <string, int> cnt;
map <string, string> word;
string str;

int main()
{
    while(cin >> str)
    {
        if (str == "#")
        {
            break;
        }
        string str2;
        str2 = str;
        for(int i = 0; i < str.length(); i++)
        {
            if(str[i] >= 'a' && str[i] <= 'z')
            {
                str2[i] -= 32;
            }
        }
        sort(str2.begin(), str2.end());
        cnt[str2]++;
        word[str] = str2;
    }
    map <string, string>::iterator i;
    for(i = word.begin(); i != word.end(); i++)
    {
        if(cnt[(*i).second] == 1)//注意判断,有一层套娃,多理解一下
        {
            cout << (*i).first << endl;
        }
    }

    return 0;
}

  • 5
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

虚引力子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值