Official

A - ノートの照合 / Matching of Notes Editorial by MMNMM Editorial for printing


初心者の方へ

この問題では、問題文中の条件を適切に実装し、出力すべき文字列を \(1\) 文字ずつ決めていくことで解くことができます。

条件を整理することで、実装が楽になる場合があります。 出力するべき文字列の \(i\) 文字目 \((1\le i\le N)\) は、次のように表すことができます。 ここで、\(S _ i\) は \(S\) の \(i\) 文字目、\(T _ i\) は \(T\) の \(i\) 文字目を表します。

  • \(S _ i=T _ i\) であるか、\(T _ i={}\)? なら、\(S _ i\)
  • \(S _ i={}\)? なら、\(T _ i\)
  • どちらでもなければ、!

これを適切に実装することで、この問題に正解することができます。

実装例は以下のようになります。

#include <iostream>
#include <string>
using namespace std;

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

    string ans(N, ' '); // 答えを入れる N 文字の文字列を作る
    for (int i = 0; i < N; ++i) {
        // S[i], T[i] を見て答えの i 文字目を決める
        if (S[i] == T[i] || T[i] == '?') {
            ans[i] = S[i];
        } else if (S[i] == '?') {
            ans[i] = T[i];
        } else {
            ans[i] = '!';
        }
    }

    // 答えを出力
    cout << ans << endl;
    cout << (ans.contains('!') ? "Yes" : "No") << endl;

    return 0;
}
N = int(input())
S = input()
T = input()

# それぞれの文字を見て答えの i 文字目を決める
ans = ''.join(s if s == t or t == '?' else t if s == '?' else '!' for s, t in zip(S, T))

# 答えを出力
print(ans)
print('Yes' if '!' in ans else 'No')

posted:
last update: