OilDrum's PLAYGROUND

どらむかんのゲーム日記サイト

当サイトの記事にはプロモーションが含まれています。

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を追加するのを忘れないようにしましょう。