@[TPPPP](/user/577650)
@[二叉苹果树](/user/270854)
by HouSibo @ 2023-08-20 22:04:19
同样的情况,我直接暴力查重qwq
```cpp
#include <bits/stdc++.h>
using namespace std;
const int N = 1e4 + 5;
char a[N]; // 表示密文对应的明文 (ch-'A')
char c[N], c1[N]; // c为密文,c1为明文
char ch[N]; // 即将破译的密文
bool vis[N]; // 表示密字(ch-'A')被使用过了没
bool vis1[N]; // 表示明字(c1-'A')被使用过了没
// 1. 每个字母只对应一个唯一的密字,不同的字母对应不同的密字
// 2. A~Z在明文中都出现过,并拥有唯一不重复的密字
int main(){
memset (a, '1', sizeof a);
scanf ("%s%s%s", c, c1, ch);
// 密、明文查重
for (int i = 0; i < strlen(c1); ++i){
for (int j = i + 1; j < strlen(c1); ++j){
if (c1[i] == c1[j] && c[i] != c[j]){
printf ("Failed");
exit(0);
}
}
}
for (int i = 0; i < strlen(c); ++i){
if (vis[c[i]-'A'] == false && a[c[i]-'A'] == '1'){
a[c[i]-'A'] = c1[i];
vis[c[i]-'A'] = true;
} else if (a[c[i]-'A'] == c1[i]){
continue;
} else {
printf ("Failed");
exit(0);
}
}
for (int i = 0; i < 26; ++i)
if (a[i] == '1'){
printf ("Failed");
exit(0);
}
for (int i = 0; i < strlen(ch); ++i)
printf ("%c", a[ch[i]-'A']);
return 0;
}
```
by _IceCream_ @ 2023-08-28 11:17:58
我感觉这道题用五个char数组就可以了啊(第一个是加密的,第二个是解出来的,第三个是ABCDEFG……,第四个是A对应的秘文,B对应的秘文……(用if判断实现),第五个是新的秘文的译文)循环判断4数组有没有重。接着就可以靠下标(阿斯克马值减去-41或-40(看你的数组3“A”从下标几开始(0就减41,1就减40)))来揪出对应的字母,有没对应上的(对应下标的2数组为空)直接输出Failed然后return 0,其余的话就把转换好的密码存到数组5里面。最后建立一个变量a为数组5的长度(具体操作我不太懂,但我看过别人做),b为0/1,最后循环a次,输出最后一个数组[b],b++。(本人为小学生,口头表达力不好,见谅)(没试过,一个思路)
by JoanneLi @ 2023-08-31 16:05:48