当サイトの記事にはプロモーションが含まれています。
ABC397 - B - Ticket Gate Log
最終更新:2025-03-19 投稿日:2025-03-19
2025/03/15に行われたオムロンプログラミングコンテスト2025(AtCoder Beginner Contest 397)のB問題の解法についての記事です。
考えたこと
操作を行ったあとの文字列は、"ioioioioio......"
のように、"i"
と"o"
の繰り返しとなっている必要があります。
また、末尾は"o"
になっていることも必要です。
これらをまとめると、操作では、
・1文字目が"i"
・2文字目~末尾\(-1 \)文字目までは"oi"
の繰り返し
・末尾が"o"
となるように処理を行えばよいということがわかります。
あとはこれを実装していくことになります。
コードの例
#include <bits/stdc++.h>
using namespace std;
int main() {
string S;
cin >> S;
char now = 'o';
int ans = 0;
for (int i = 0; i < (int)S.size(); i++) {
if (now == 'o' && S.at(i) == 'i') {
now = 'i';
} else if (now == 'o' && S.at(i) == 'o') {
ans++;
now = 'o';
} else if (now == 'i' && S.at(i) == 'i') {
ans++;
now = 'i';
} else if (now == 'i' && S.at(i) == 'o') {
now = 'o';
}
}
if (S.at((int)S.size() - 1) == 'i') {
ans++;
}
cout << ans << endl;
return 0;
}
解法
前回チェックした文字が'i'
と'o'
のいずれだったかを記憶させながら1文字ずつチェックしていきます。
次に出てくる文字が記憶した文字と違っていたら良いのですが、同じだったら間に'i'
か'o'
を挿入する必要があるので、答えが\( 1 \)増えます。
最後までチェックが終わったあと、最後の文字が'i'
であれば文字列の末尾に'o'
を挿入してやる必要があるため、1を追加するのを忘れないようにしましょう。