Ancient Cipher(UVA1339)

Ancient Cipher(UVA1339)_第1张图片


感觉这道水题很有意思,起先心想这怎么做,既能随意重排,又能有随意的映射。后来一想,不可能这么这么复杂,一定是有地方我没有想到。果然啊,自我回想了一下,这种一点思路没有的题目我个人感觉最好的办法去尝试题中例子一个一个带入,看看为什么可以,慢慢就会找到问题的本质。比如输入AABBCC     SSDDCC,很明显,这是可以的 。输入ABCABC, SDCSDC。和上一个输入一样,那肯定也是YES。一般我们总是想一旦某项事物的顺序改变,那么结果肯定是改变的。因为大多数情况下顺序是一件事物本质之一。但很明显,一提到映射,顺序就完全不重要了。只要求能对应上OK了。那么这题的本质就是字母的个数。就是映射的那种感觉。统计出两个字符串中每个字母的出现的次数。加入str1字符中B出现了4次,那么str2中必须要有一个字母 出现4次才可以,因为这样可以一一对应。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int com(const void *a, const void *b)
{
    return *(int *)b - *(int *)a;
}
int main()
{
    //freopen("input.txt", "r", stdin);
    //freopen("output.txt", "w", stdout);
    char str1[110], str2[110];
    int arr1[30], arr2[30];
    int len;
    int i,j,k;
    while(scanf("%s%s", str1, str2)!=EOF)
    {
        len=strlen(str1);
        memset(arr1, 0, sizeof(arr1));
        memset(arr2, 0, sizeof(arr2));
        //for(i=0;str1[i];i++) arr1[str1[i]-'A']++;
        //for(i=0;str2[i];i++) arr2[str2[i]-'A']++;//网上的优秀代码,拿来学习
        for(i=0;i<26;i++)
        {
           for(j=0;j<len;j++)
               if((str1[j]-'A')==i)
                    arr1[i]++;

           for(k=0;k<len;k++)
               if((str2[k]-'A')==i)
                    arr2[i]++;
        }
        qsort(arr1, 26, sizeof(int), com);
        qsort(arr2, 26, sizeof(int), com);
        printf("%s\n", memcmp(arr1, arr2, sizeof(arr1)) ? "NO":"YES");
    }

    return 0;
}


你可能感兴趣的:(ACM,水题,uva)