1339 - Ancient Cipher

Problem.png

本题讨论了一种加密方法:先对明文的每个字母进行一一映射,即每个字母映射到的字母互相都是不同的,然后再对映射后的字母进行重排,得到密文。
现在给出密文和猜测的明文,判断该明文是否可能是密文解密后的结果,是则YES,不是则NO。
因为经过了一一映射的过程,所以如果该明文可以加密成给定的密文的话,那么两者所包含的字母的种类和相应的个数一定是相同的,重排只是影响了字母的位置而已。因此分别统计两个字符串中每个字母出现的次数存进数组,再对这两个数组进行排序,如果排序后的结果相同,那么该明文和密文就可能相互映射。
注意题目中只是举例说明了一种可能的映射方式(A->B, B->C...),其实该映射方式是不确定的,不要想当然。

#include 
#include 
#include 

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;
}

你可能感兴趣的:(1339 - Ancient Cipher)