Ancient Cipher
题意
给定两个长度相同且不超过100的字符串,判断是否能把其中一个字符串的各个字母重排,然后对26个字母做一个一一映射,使得两个字符串相同。
如JWPUDJSTVP重排后可以得到WJDUPSJPVT,然后把每个字母映射到它前一个字母(B->A, C->B, …, Z->Y, A->Z),得到VICTORIOUS。
输入两个字符串,输出YES或者NO。
题解
分别记录两个字符串中字母A到Z出现的次数,当他们的形式完全相同时,那么他们肯定可以实现一一映射;
比如说在第一个串中A到Z依次是1,2 ,.., 26,而在第二个串中A到Z依次是26, 25, .. , 1,那么他们在形式上是一样的;
也就是说,他们出来的次数组成的数组排序之后应该是相等的。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
const int maxn = 1e4 + 5;
#define met(a, b) memset(a, b, sizeof(a));
char a[maxn], b[maxn];
int ca[26], cb[26];
int main() {
#ifdef _LOCAL
freopen("in.txt", "r", stdin);
#endif
while(scanf("%s%s", a, b) != EOF) {
met(ca, 0); met(cb, 0);
int len = strlen(a);
for(int i = 0; i < len; ++i) {
++ca[a[i]-'A']; ++cb[b[i]-'A'];
}
sort(ca, ca + 26); sort(cb, cb + 26);
if(memcmp(ca, cb, 26 * sizeof(int)) == 0) printf("YES\n");
else printf("NO\n");
}
return 0;
}