意外に細部を詰めるのが大変な感じ。
問題概要
2 つの文字 は以下のいずれかの条件を満たすとき、似ているという。
と
は同じ文字
のうち、片方が '1' で、もう片方が 'l'
のうち、片方が '0' で、もう片方が 'o'
2 つの 文字の文字列
が与えられる。任意の
に対して
と
が似ているかどうかを判定せよ。
考えたこと
結局、文字 が似ているかどうかを判定できればよい。次の 5 通りのいずれかを満たすかを判定すればよい。
= '0' かつ
= 'o'
= 'o' かつ
= '0'
= '1' かつ
= 'l'
= 'l' かつ
= '1'
ただ、少しでも楽をするために、次のように考えた。3 通りに減らせた。
もし文字 が '0' または '1' ならば
swap(x, y)
とする。これによって、次のいずれかを満たすかを判定すれば良いこととなる。
= '0' かつ
= 'o'
= '1' かつ
= 'l'
文字 が似ているかどうかの判定ができれば、あとはすべての
に対して
と
が似ているかどうかを判定すればよい。
コード
#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; }