けんちょんの競プロ精進記録

競プロの精進記録や小ネタを書いていきます

JOI 一次予選 2023 (第 3 回) C - JOI エディタ (7Q, 難易度 2)

意外と難しいかもしれない。for 文を回しながら、「前の文字」を見る技術を手に入れよう!

問題概要

文字 j, o, i からなる長さ  N の文字列  S が与えられる。

この文字列をテキストエディタに打ち込むことを考える。同じ文字が 2 個連続したとき、それらの文字はともに大文字になる。

最終的に打ち込まれた文字列を求めよ。

解法

たとえば jjoiii と打ち込むと、JJoIIi となる。

具体的には、次のようにすればよい。


 i = 1, 2, \dots, N-1 について、

もし  S i 文字目と、 i-1 文字目とが等しいならば、 i 文字目と  i-1 文字目を大文字に変換する


ここで、 i = 0 からではなく、 i = 1 から回していることに注意しよう。 i = 0 に対しては、 S i-1 文字目にはアクセスできないのだ。

コード

#include <bits/stdc++.h>
using namespace std;

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

    for (int i = 1; i < N; ++i) {
        if (S[i] == S[i-1]) {
            S[i] = S[i] + 'A' - 'a';
            S[i-1] = S[i-1] + 'A' - 'a';
        }
    }
    cout << S << endl;
}