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

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

AtCoder ABC 339 A - TLD (7Q, 灰色, 100 点)

for 文のいい練習問題!

問題概要

英小文字と文字 . のみからなる文字列  S が与えられる。

 S を文字 . で分割したときの末尾の文字列を出力してください。

制約

  •  S には文字 . が 1 つ以上含まれる

考えたこと

まずは、 S に含まれる文字 . のうち、最も右側にあるものがどこにあるのか(それを表す  S の添字を last とする)を求めることにしよう。これは 2 種類の方針が考えられる。

  • 1:文字列  S を左側から見ていく。つまり、 i = 0, 1, \dots, |S|-1 の順に for 文を回して、S[i] == '.' となるたびに last を更新する
  • 2:文字列  S を右側から見ていく。つまり、 i = |S|-1, |S|-2, \dots, 0 の順に for 文を回して、最初に S[i] == '.' となったときに last を更新の上、break する

ここでは、オーソドックスな方針 1 で実装しよう。次のように実装できる。

int last;
for (int i = 0; i < S.size(); ++i) {
    if (S[i] == '.') last = i;
}

文字列  S 中の最後の文字 '.' の添字 last が求められたならば、 Slast + 1 文字目以降を答えればよい。

コード

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

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

    int last;
    for (int i = 0; i < S.size(); i++) {
        if (S[i] == '.') last = i;
    }
    cout << S.substr(last + 1) << endl;
}