Ancient Cipher UVA - 1339

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

 

posted @ 2019-03-23 17:22  超融合  阅读(162)  评论(0编辑  收藏  举报