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

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

AtCoder ABC 132 A - Fifty-Fifty (灰色, 100 点)

これはだいぶ難しい問題ですね!

問題概要

4 文字の文字列  S が与えられる。

 S がちょうど 2 種類の文字からなり、それらの文字がちょうど 2 個ずつあるかどうかを判定せよ。

解法

色んな解法があると思われる。ここでは、 S をアルファベット順にソートしてしまうことを考えた。

そうすると、たとえば  S = "bebe" のときには、 S = "bbee" というようになる。そうすれば、次の条件をすべて満たすかどうかを判定すればよくなる。

  • S[0] == S[1]
  • S[1] != S[2]
  • S[2] == S[3]

ここで、S[1] != S[2] という条件を忘れてはいけない。これを入れておかないと  S = "ffff" のようなものも "Yes" と誤判定してしまうのだ。

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

int main() {
    string S;
    cin >> S;
    sort(S.begin(), S.end());
    
    if (S[0] == S[1] && S[1] != S[2] && S[2] == S[3])
        cout << "Yes" << endl;
    else
        cout << "No" << endl;
}