意外に細部を詰めるのが大変な感じ。
問題概要
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; }