https://vjudge.net/problem/UVA-1339
这题虽然不难,我猜好多人和我一样开始根本看不懂这题什么玩意,因为刘汝佳的篇幅太短了,而网站上的原题又是英语劝退,再加上有道不说人话。。。。。
如果你只想看懂题目:
它意思就是有两种加密方式,一种用字母间的映射关系,另一种用重排任意个字母的顺序。
①:我的理解它说的映射不是固定的一种,并不是说全部按照例子里的一样{a->z z->a 其他顺延},这只是一种,它的具体映射关系并不会告诉你,你只要直到它的映射只能是一对一的,且只会 单独用一种!比如HEHE和HAHA能返回YES,其中就是E->A
②:这个一般都能理解,就是可以随便排序,所以该问题一定与顺序无关。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
题解:
只要记录每个字母出现的次数在数组book1[26]和book2[26]里,再将数组排序,如果两个数组相同则这两个串一定可以通过某种映射获得。因为他可以通过映射交换来调整每个字母的权(次数)最终肯定能让两个串对应上的。
#include<iostream> #include<string> #include<algorithm> using namespace std; int main() { string S1, S2; int cnt1[26], cnt2[26]; while (cin >> S1 >> S2) { memset(cnt1, 0, sizeof(cnt1)); memset(cnt2, 0, sizeof(cnt2)); string::iterator it = S1.begin(); for (; it != S1.end(); it++) cnt1[*it - 65]++; it = S2.begin(); for (; it != S2.end(); it++) cnt2[*it - 65]++; sort(cnt1, cnt1 + 26); sort(cnt2, cnt2 + 26); bool flag = true; for (int i = 0; i < 26; i++) { if (cnt1[i] != cnt2[i]) flag = false; } if (flag)cout << "YES"; else cout << "NO"; cout << endl; } return 0; }