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

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

AtCoder ABC 344 A - Spoiler (7Q, 灰色, 100 点)

いろんな方法がある! ここでは、文字 '|' のある 2 つの添字を特定するという方法で挑むことにする。

問題概要

英小文字と | のみからなる文字列  S が与えられる。 S| をちょうど 2 個含むことが保証される。

2 つの | の間にある文字および | S から削除して得られる文字列を答えよ。

考えたこと

ここでは次の 2 つの値を求めることとした。


  • leftS[i] = '|' であるような i の小さい方の値
  • rightS[i] = '|' であるような i の大きい方の値

これは for 文を一回回せば求められる(下のコードを参照)。これらの値が求められたら、

  • left の左側の文字列:S.substr(0, left)
  • right の右側の文字列:S.substr(right + 1)

を連結したものが答えとなる。

コード

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

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

    // left: 左側の '|' の添字、right: 右側の '|' の添字
    int left = -1, right = -1;
    for (int i = 0; i < S.size(); ++i) {
        if (S[i] == '|') {
            if (left == -1) left = i;
            else right = i;
        }
    }

    // left の左側と、right の右側のみを取り出す
    cout << S.substr(0, left) + S.substr(right + 1) << endl;
}