LA3213加密

题意:
      白书上有些题的题意说的太蛋疼了,这个题的意思是说有两种加密方式,一种是交换位置,另一种是一一映射,交换位置是指如ABCD 可以加密成DCBA 也可以加密成ACBD就是把某些字母的位置改变了,至于是谁和谁交换随意,而一一映射是指ADD 可以加密成 BCC但不可以加密成ABC,然后现在有一种新的加密方式就是前面两个的合成版,现在问题来了,给你两个字母串(只有大写字母)问其中一个是不是由另一个经过新的加密方式(就是那两个方式合成在一起)加密过来的。


思路:
      我们想一下,对于第一种加密方式,既然是可以随意改变位置,对于给定的两个串我们就不用考虑他们的顺序了,直接统计每个字母的出现个数,得到一个出现个数的序列,然后对于第二种加密,说是可以映射,但是映射谁我所谓只要不冲突就行,那么我们就不用管具体是那个字母出现了多少次,我们只要出现次数,然后我们把两个出现次数序列sort一遍,然后一一对应比较就行了,具体细节看代码。


#include<stdio.h>
#include<string.h>
#include<algorithm>


using namespace std;


int mk1[30] ,mk2[30];
char st1[110] ,st2[110];


int main ()
{
   int i ,l ,Ans;
   while(~scanf("%s" ,st1))
   {
       scanf("%s" ,st2);
       l = strlen(st1) - 1;
       memset(mk1 ,0 ,sizeof(mk1));
       memset(mk2 ,0 ,sizeof(mk2));
       for(i = 0 ;i <= l ;i ++)
       {
           mk1[st1[i] - 'A'] --;
           mk2[st2[i] - 'A'] --;
       }
       sort(mk1 ,mk1 + 26);
       sort(mk2 ,mk2 + 26);
       for(Ans = 0 ,i = 0 ;i <= 25 && !Ans;i ++)
       if(mk1[i] != mk2[i]) Ans = 1;      
       !Ans ? puts("YES") : puts("NO");
   }
   return 0;
}
       





原文地址:https://www.cnblogs.com/csnd/p/12062670.html