这道题中original中不同的字母会首先映射到别的字母,然后任意排列。所以只需要有没有这样的映射存在就好,不必把排列也确定下来。做法是统计每个字母出现的次数,然后将按照从小到大排序,一一对比原排列和加密后的,看是否有不同。如果没有,说明存在这样的映射(对比本身就是一种映射)。
thestoryofsnow | 2159 | Accepted | 196K | 0MS | C++ | 1189B |
/*
ID: thestor1
LANG: C++
TASK: poj2159
*/
#include <iostream>
#include <fstream>
#include <cmath>
#include <cstdio>
#include <cstring>
#include <limits>
#include <string>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <algorithm>
#include <cassert>
using namespace std;
int main()
{
string encrypted, original;
// scanf("%s", encrypted);
// scanf("%s", original);
cin >> encrypted;
cin >> original;
// cout << "encrypted:" << encrypted << endl;
// cout << "original:" << original << endl;
std::vector<int> encryptedcount(26, 0), originalcount(26, 0);
for (int i = 0; i < encrypted.size(); ++i)
{
encryptedcount[encrypted[i] - 'A']++;
}
for (int i = 0; i < original.size(); ++i)
{
originalcount[original[i] - 'A']++;
}
sort(encryptedcount.begin(), encryptedcount.end());
sort(originalcount.begin(), originalcount.end());
bool yes = true;
for (int i = 0; i < 26; ++i)
{
if (encryptedcount[i] != originalcount[i])
{
yes = false;
break;
}
}
if (yes)
{
printf("YES\n");
}
else
{
printf("NO\n");
}
return 0;
}