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