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

posted on 2022-04-15 17:06  chelly酱  阅读(29)  评论(0)    收藏  举报

导航