本題討論了一種加密方法:先對明文的每個字母進行一一映射滴铅,即每個字母映射到的字母互相都是不同的瓮钥,然后再對映射后的字母進行重排底桂,得到密文式散。
現(xiàn)在給出密文和猜測的明文筋遭,判斷該明文是否可能是密文解密后的結果,是則YES暴拄,不是則NO漓滔。
因為經(jīng)過了一一映射的過程,所以如果該明文可以加密成給定的密文的話乖篷,那么兩者所包含的字母的種類和相應的個數(shù)一定是相同的响驴,重排只是影響了字母的位置而已。因此分別統(tǒng)計兩個字符串中每個字母出現(xiàn)的次數(shù)存進數(shù)組撕蔼,再對這兩個數(shù)組進行排序豁鲤,如果排序后的結果相同石蔗,那么該明文和密文就可能相互映射。
注意題目中只是舉例說明了一種可能的映射方式(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;
}