CODE FESTIVAL 2017 Fianl | B - Palindrome-phobia


問題

https://atcoder.jp/contests/cf17-final/tasks/cf17_final_b

考えたこと

Sは3種類の文字(a, b, c)しか使えず2文字以上である。
文字列の長さをNとする。N = 2N = 3のときについて考えてみる。

N = 2のときは同じ文字だと回文になり、異なる文だと回文にならない。
N = 3のときは3文字とも異なる文字なら回文にならない。

N = 4文字以上の場合は以下のようにabcabc...とabcの繰り返しになれば回文にならない。

この時、a, b, cの各文字数の長さを考えると以下のように差が最大1文字ならabcで並べる事が可能である。

コード

#include <bits/stdc++.h>

#include <atcoder/all>

using namespace std;
using namespace atcoder;
using ll = long long;
using ld = long double;
using uint = unsigned int;
using ull = unsigned long long;
const int MOD = 1e9 + 7;

bool solve(unordered_map<ll, ll> &cnt, ll n) {
  if (cnt.size() == 1) {
    return n == 1;
  }
  if (cnt.size() == 2) {
    return n == 2;
  }
  int a = cnt[0];
  int b = cnt[1];
  int c = cnt[2];
  return abs(a - b) <= 1 && abs(b - c) <= 1 && abs(a - c) <= 1;
}

int main() {
  string s;
  cin >> s;
  unordered_map<ll, ll> cnt;
  for (int i = 0; i < s.size(); i++) {
    cnt[s[i] - 'a']++;
  }
  cout << (solve(cnt, s.size()) ? "YES" : "NO") << endl;
}

参考