P107潜伏者

这题题解是因为我忘记了map

看到这个题目的时候没有反映过来,可能是实战的时候自己第一次遇见这种题型,还是比较基础的,所以把他发出来,自己巩固复现一下。

下面是代码,我们要知道map的这种存储方式的特殊功能,首先我觉得用在这一题里面最重要的功能就是一一对应,像这个题的要求就是需要密码和密码一一对应,不能重复出现,所以说定义两个map,一个存储加密前m对应加密后b,一个用来b对应a,然后为了保持密码的唯一性,在加入这个密码本的时候就要注意了,同时需要注意有没有重复,如果重复了话就说明这个密码加密是有问题的,最后如果二十六个字母全部加密完以后再开始对文本开始加密。

此时就可以调用a密码本,以c(要加密的文本中的字母)里面的元素为键,来输出前对应的值。

这个题目到这里就结束了

然后写到这里,前面忘记提了,map还有一个非常重要的特性就是,map默认对值从大到小开始排序,如果需要从小到大可以参考mp<char,char,greater<char>>来定义map结构。

ok无了下面是代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<map>
using namespace std;
map<char,char> mp,mq;
int main()
{
    int la,lb,lc,book=26;
    char a[10005],b[10005],c[10005];
    cin>>a>>b>>c;
    la=strlen(a);
    lb=strlen(b);
    lc=strlen(c);
    if(la!=lb||la<26)
    {
        cout<<"Failed\n";
        return 0;
    }
    for(int i=0;i<la;i++)
    {
        if(mp[a[i]]==0&&mq[b[i]]==0)
        {
            mp[a[i]]=b[i];
            mq[b[i]]=a[i];
            book--;
        }
        else if(mp[a[i]]!=b[i]||mq[b[i]]!=a[i])
        {
            cout<<"Failed\n";
            return 0;
        }
    }
    if(book>0)
    {
        cout<<"Failed\n";
        return 0;
    }
    for(int i=0;i<lc;i++)
    {
        cout<<mp[c[i]];
    }
    cout<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值