这题题解是因为我忘记了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;
}