けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

AtCoder ABC 303 A - Similar String (7Q, 灰色, 100 点)

意外に細部を詰めるのが大変な感じ。

問題概要

2 つの文字  x, y は以下のいずれかの条件を満たすとき、似ているという。

  •  x y は同じ文字
  •  x, y のうち、片方が '1' で、もう片方が 'l'
  •  x, y のうち、片方が '0' で、もう片方が 'o'

2 つの  N 文字の文字列  S, T が与えられる。任意の  i = 1, 2, \dots, N に対して  S_{i} T_{i} が似ているかどうかを判定せよ。

考えたこと

結局、文字  x, y が似ているかどうかを判定できればよい。次の 5 通りのいずれかを満たすかを判定すればよい。

  •  x = y
  •  x = '0' かつ  y = 'o'
  •  x = 'o' かつ  y = '0'
  •  x = '1' かつ  y = 'l'
  •  x = 'l' かつ  y = '1'

ただ、少しでも楽をするために、次のように考えた。3 通りに減らせた。


もし文字  y が '0' または '1' ならば swap(x, y) とする。これによって、次のいずれかを満たすかを判定すれば良いこととなる。

  •  x = y
  •  x = '0' かつ  y = 'o'
  •  x = '1' かつ  y = 'l'

文字  x, y が似ているかどうかの判定ができれば、あとはすべての  i に対して  S_{i} T_{i} が似ているかどうかを判定すればよい。

コード

#include <bits/stdc++.h>
using namespace std;

bool sim(char x, char y) {
    if (x == y) return true;
    if (y == '0' || y == '1') swap(x, y);
    if (x == '0' && y == 'o') return true;
    if (x == '1' && y == 'l') return true;
    return false;
}

int main() {
    int N;
    string S, T;
    cin >> N >> S >> T;

    bool res = true;
    for (int i = 0; i < N; i++) {
        if (!sim(S[i], T[i])) res = false;
    }

    cout << (res ? "Yes" : "No") << endl;
}