AtCoder Beginner Contest 047 C - 一次元リバーシ
問題
BかWの並んだ文字列が与えられます。
オセロの要領で先頭か末尾に文字をつけたして、すべて同じ文字にします。
最小で何文字付け加えればよいでしょうか。
制約
- 1 |S|
- 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; }