LA 3213 Ancient Cipher

LA_3213

    题目的大意是将第二个字符串中的每个字符先做一个一一映射,然后再将各个字符打乱(也就是选择性地变换一下位置),问能否变成第一个字符串。

    这个问题中有一个守恒量,就是各类字符的数量,比如一开始各类字符的数量分别为1、2、2、3的话,那么无论怎么变换,最后各类字符的数量一定还是1、2、2、3,只不过之前有3个的可能是A,而现在变成了有3个的是B,或者Y,或者其他的字符等等。而且,如果各类字符在数量上能够一一对应的话,那么一定可以通过某种手段将第二个字符串变成第一个字符串,所以我们只需判断各类字符的数量上能否一一对应。

#include<stdio.h>
#include<string.h>
#define MAX 130
char a[MAX], b[MAX];
int n[MAX];
int main()
{
    while(scanf("%s%s", a, b) == 2)
    {
        bool ok = true;
        memset(n, 0, sizeof(n));
        for(int i = 'A'; i <= 'Z'; i ++)
        {
            int cnt = 0;
            for(int j = 0; a[j]; j ++) if(a[j] == i) ++ cnt;
            ++ n[cnt];
            cnt = 0;
            for(int j = 0; b[j]; j ++) if(b[j] == i) ++ cnt;
            -- n[cnt];
        }
        for(int i = 1; i <= 100; i ++) if(n[i]) ok = false;
        puts(ok ? "YES" : "NO");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/staginner/p/2760207.html