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

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

AtCoder ABC 349 B - Commencement (5Q, 灰色, 200 点)

まずは各文字が何回ずつ使われるかを求めよう!

問題概要

英小文字のみからなる長さ  N の文字列  S が与えられる。次の条件を満たすかどうかを判定せよ。

【条件】
すべての  i = 1, 2, \dots に対して、 S 中にちょうど  i 回登場する文字が 0 種類または 2 種類である。

制約

  •  1 \le N \le 100

考えたこと

まず、各文字の出現頻度を求めるために、次の配列を求めましょう。


  • num[c]:文字列  S 中に文字  c が何個あるか

これを求めたあとは、 i = 1, 2, \dots (具体的には  i \le N の範囲で)について、num[x] == i となる文字 x が 0 または 2 個であることを確かめればよいでしょう。

コード

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

int main() {
    string S;
    cin >> S;
    vector<int> num(26, 0);
    for (auto c : S) num[c - 'a']++;

    bool res = true;
    for (int i = 1; i <= S.size(); i++) {
        int syurui = 0;
        for (int j = 0; j < 26; j++) if (num[j] == i) syurui++;
        if (syurui != 0 && syurui != 2) res = false;
    }
    cout << (res ? "Yes" : "No") << endl;
}