本题是一道例题,但是可能是由于书上没给出实现代码,所以开始的时候并没有理解到题目的意思。题目的要求不是按照每个字母向前一个映射的方法解码!而是每一种密码都可以随意映射,只要有一种符合给出的猜测就好。这样理解的话只要分别统计密码串和猜测串中每个字母出现的次数后进行排序,如果排序后的数组完全相同,那么一定存在某种映射使得两个串相同,而不用去管每个字母分别是什么。
题目链接:UVa 1339
AC代码:
#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
using namespace std;
int guess[30], proper[30];
char s[110], t[110];
int compare(const void *a, const void *b) {
return *(int *)a - *(int *)b;
}
int main() {
while (cin >> s >> t) {
memset(guess, 0, sizeof(guess));
memset(proper, 0, sizeof(proper));
bool flag = 0;
int len = strlen(s);
for (int i = 0; i < len; i++) {
guess[s[i] - 'A']++;
proper[t[i] - 'A']++;
}
qsort(guess, 26, sizeof(int), compare);
qsort(proper, 26, sizeof(int), compare);
for (int i = 0; i < 26; i++) {
if (guess[i] != proper[i]) {
flag = 1;
break;
}
}
if (flag)
cout << "NO" << endl;
else
cout << "YES" << endl;
}
return 0;
}