2 条题解
-
2
我就简单讲一下我的代码的思路(学了c++的map头文件的更容易解决).
首先,看题给的提示可以想出,每一个字母都有一一对的关系,但我们从样例3中可以看出,它有一个字母的关系是要我们自己推的,从初始密码可以数出有26种字母,而解密的密码只有25种。
我只需要定义两个容器,这两个容器是来找那个需要我们自己推断的字母,有这个字母我就+1,没有的则为0,以此遍历,到最后找到这个需要我们推的字母。
**一定要搞清楚键和值,别混淆了
***注:map函数自带排序,从小到大,并且元素是唯一的,eg:bcjdddj 输出就是bcdj
#include <iostream>
#include <map>
using namespace std;
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
string a, b, c;
cin >> a;
cin >> b;
cin >> c;
map<char, char>mp;
map<char, int>r1, r2;
int cs = 0;
for (size_t i = 0; i < a.size(); i++) {
mp[b[i]] = a[i];
if (!r1[b[i]]) {
cs++;//找26种英文字母出现次数
r1[b[i]]++;
}
}
char p;
if (cs == 25) {
for (size_t i = 0; i < a.size(); i++) {
r2[a[i]]++;
} for (char al = 'a'; al <= 'z'; al++) {
if (!r2[al]) {
p = al;
break;
}
}
}
string al = "";
int pd = 1;
for (size_t l = 0; l < c.size(); l++) {
if (mp.find(c[l]) != mp.end()) {
al += mp[c[l]];
} else if (cs == 25) {
al += p;
} else {
pd = 0;
break;
}
}
if (!pd) {
cout << -1 << endl;
} else {
cout << al << endl;
} return 0;
}
-
0
#include <stdio.h> #include <string.h> int main() { char a[200],b[200],c[200]; scanf("%s%s%s",a,b,c); int num[200]={0}; for(int i=0;i<strlen(a);i++) if(num[(int)b[i]]==0)num[(int)b[i]]=a[i]; int pos,count; for(int i='a';i<='z';i++) if(num[i]==0)pos=i; else count++; if(count==25) { int alpha[200]; for(int i='a';i<='z';i++) { alpha[num[i]]=1; } for(int i='a';i<='z';i++) { if(alpha[i]!=1) num[pos]=i; } } for(int i=0;i<strlen(c);i++) { c[i]=num[(int)c[i]]; if(c[i]==0){printf("-1");return 0;} } printf("%s",c); return 0; }//有手就行
- 1
信息
- ID
- 1091
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 280
- 已通过
- 37
- 上传者