UVa1339 Ancient Cipher
题目链接
(第一次写英文题,阅读理解好痛苦)
题意描述
这道题目就是说输入到两个字符串,然后看着字符串a能否通过两个操作变成字符串b,
操作1 : 类似于a->b,b->c这样,为字母之间创造一个映射关系,例:abc->bcd
操作2 : 改变组合顺序,对应的是字符串的下标,例: bcd->[3, 1, 2]->dbc
因此通过上面两个操作abc->dbc,这样是一个合法的方案
思路分析
乍一看好像很复杂,但实际上我们只需要判断,可以发现,所有操作都是一一对应的,每个映射的数量没有变化,因此实际上只需要统计一下字母的数量,然后sort一遍,看看对应的映射数量,如果相同就是合法的,否则非法
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
const int N = 110;
char a[N], b[N];
int cnt_a[26], cnt_b[26];
int main() {
while (scanf("%s %s", a, b) != EOF) {
int n = strlen(a);
if ((int) strlen(b) != n) {
puts("NO");
continue;
}
memset(cnt_a, 0, sizeof cnt_a);
memset(cnt_b, 0, sizeof cnt_b);
for (int i = 0; i < n; i++) {
++cnt_a[a[i] - 'A'];
++cnt_b[b[i] - 'A'];
}
sort(cnt_a, cnt_a + 26);
sort(cnt_b, cnt_b + 26);
bool flag = true;
for (int i = 0; i < 26; i++) {
if (cnt_a[i] != cnt_b[i]) {
flag = false;
break;
}
}
if (flag) puts("YES");
else puts("NO");
}
return 0;
}
浙公网安备 33010602011771号