当サイトの記事にはプロモーションが含まれています。
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を追加するのを忘れないようにしましょう。