UVa1339
题目意思为判断明文是否可以经过位置变换以及字母替换得到密文。因为不需要输出替换方案,只判断存在性,那就先不考虑搜索。
位置变换不用考虑,因为只要长度一样,就肯定能逆回去,关键是字母替代。可以把明文和密文先进行排序,然后看模式是否相同,比如题目中第一组测试数据JWPUDJSTVP和VICTORIOUS排序之后分别变为:
DJJPPSUVW |
CIIOORTUV |
而最后一组数据NEERCISTHEBEST和SECRETMESSAGES排序之后变为:
BCEEEEHINRSSTT |
ACEEEEGMRSSSST |
对比可以发现如果是一对明文密文变换,那么出现次数相同的字母数量是一样多的,这也就是书上说的计数然后排序的方法(然而我并没有想到排序,而是想再进行一次计数,看看字母数量是不是一样多。。。)。
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
bool check(const string &strCipher, const string &strPlain)
{
vector<int> viCntCipher(26, 0), viCntPlain(26, 0);
for (size_t i = 0; i < strCipher.size(); i++)
{
viCntCipher[strCipher[i] - 'A']++;
}
for (size_t i = 0; i < strPlain.size(); i++)
{
viCntPlain[strPlain[i] - 'A']++;
}
sort(viCntCipher.begin(), viCntCipher.end());
sort(viCntPlain.begin(), viCntPlain.end());
for (size_t i = 0; i < viCntCipher.size(); i++)
{
if (viCntCipher[i] != viCntPlain[i]) return false;
}
return true;
}
int main()
{
string strCipher, strPlain;
while (cin >> strCipher >> strPlain){
if (check(strCipher, strPlain)) cout << "YES" << endl;
else cout << "NO" << endl;
}
return 0;
}
/*
JWPUDJSTVP
VICTORIOUS
MAMA
ROME
HAHA
HEHE
AAA
AAA
NEERCISTHEBEST
SECRETMESSAGES
*/
本文介绍了一种通过比较明文和密文的字母出现次数来判断是否存在有效的加密方式的方法。该方法首先对明文和密文进行排序,然后比较排序后的字母出现次数是否一致。
278

被折叠的 条评论
为什么被折叠?



