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

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

AtCoder ABC 276 A - Rightmost (7Q, 灰色, 100 点)

for 文の練習!

問題概要

英小文字からなる文字列  S が与えられる。

 S に含まれる文字 'a' のうち、最も右側にあるものについて、その添字を答えよ。ただし、'a' が含まれない場合は -1 を出力せよ。

考えたこと

「最も右側」という条件がなければ、次のように書けるだろう。これはごくありふれた「条件を満たす添字を求めよ」というタイプの問題に対する回答としてよくある書き方だ。

 int res = -1;  // 現れないことを想定して -1 を初期値にする
    for (int i = 0; i < S.size(); i++) {
        if (S[i] == 'a') res = i+1;  // 「+1」は 0-indexed を直すため
    }
}

そして実は、これだけですでに「最も右側の添字」が求められているのだ。なぜならば、条件を満たす添字 i が見つかるたびに

res = i+1;

という更新を行っているからだ。つまり res には「最後に更新したときの添字」が格納されているのだ。

というわけで、この問題は解けた。

コード

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

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

    int res = -1;  // 現れないことを想定して -1 を初期値にする
    for (int i = 0; i < S.size(); i++) {
        if (S[i] == 'a') res = i+1;
    }
    cout << res << endl;
}