おじさんの競プロ記録

自分の力で解答できた問題を振り返り、理解を深めたいです。

AtCoder Beginner Contest 047 C - 一次元リバーシ

問題

問題文へ

BかWの並んだ文字列が与えられます。

オセロの要領で先頭か末尾に文字をつけたして、すべて同じ文字にします。

最小で何文字付け加えればよいでしょうか。

制約

  • 1 \leqq |S| \leqq 10^{5}
  • Sに含まれる文字は'B'または'W'のいずれかである

考えたこと

先頭の文字を覚えます。仮にBだったとします。続けて文字列を走査します。

Wがあれば先頭にWを置き、ひっくりかえさねばなりませんが実際に行う必要はありません。

違う文字に出会った時をカウントアップして、今度はWを覚えて違う文字に出会うまで進みます。

#define _GIBCXX_DEBUG
#include <bits/stdc++.h>
using namespace std;
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define all(v) v.begin(), v.end()
using namespace std;
using ll = long long;


int main(void) {
  string S;
  cin >> S;

  char checker = S[0];
  int ans = 0;
  for (int i = 1; i < S.size(); ++i) {
    if (S[i] != checker) {
      ++ans;
      checker = S[i];
    }
  }

  cout << ans << endl;
  
  return 0;
}