本题讨论了一种加密方法:先对明文的每个字母进行一一映射,即每个字母映射到的字母互相都是不同的,然后再对映射后的字母进行重排,得到密文。
现在给出密文和猜测的明文,判断该明文是否可能是密文解密后的结果,是则YES,不是则NO。
因为经过了一一映射的过程,所以如果该明文可以加密成给定的密文的话,那么两者所包含的字母的种类和相应的个数一定是相同的,重排只是影响了字母的位置而已。因此分别统计两个字符串中每个字母出现的次数存进数组,再对这两个数组进行排序,如果排序后的结果相同,那么该明文和密文就可能相互映射。
注意题目中只是举例说明了一种可能的映射方式(A->B, B->C...),其实该映射方式是不确定的,不要想当然。
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
int main() {
string e, p; // e为密文,p为明文
while (cin >> e >> p) {
int ce[26] = {0};
int cp[26] = {0};
for (int i = 0; i < e.length(); i++) {
ce[e[i] - 'A']++;
cp[p[i] - 'A']++;
}
sort(ce, ce + 26);
sort(cp, cp + 26);
bool flag = true;
for (int i = 0; i < 26; i++) {
if (ce[i] != cp[i]) {
flag = false;
break;
}
}
if (flag) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}