**题意:
白书上有些题的题意说的太蛋疼了,这个题的意思是说有两种加密方式,一种是交换位置,另一种是一一映射,交换位置是指如ABCD 可以加密成DCBA 也可以加密成ACBD就是把某些字母的位置改变了,至于是谁和谁交换随意,而一一映射是指ADD 可以加密成 BCC但不可以加密成ABC,然后现在有一种新的加密方式就是前面两个的合成版,现在问题来了,给你两个字母串(只有大写字母)问其中一个是不是由另一个经过新的加密方式(就是那两个方式合成在一起)加密过来的。
思路:
我们想一下,对于第一种加密方式,既然是可以随意改变位置,对于给定的两个串我们就不用考虑他们的顺序了,直接统计每个字母的出现个数,得到一个出现个数的序列,然后对于第二种加密,说是可以映射,但是映射谁我所谓只要不冲突就行,那么我们就不用管具体是那个字母出现了多少次,我们只要出现次数,然后我们把两个出现次数序列sort一遍,然后一一对应比较就行了,具体细节看代码。
#include
#include
#include
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;
}**
手机扫一扫
移动阅读更方便
你可能感兴趣的文章