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

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

AtCoder ABC 322 A - First ABC 2 (灰色, 100 点)

「連続文字列」を処理する典型問題。

問題概要

文字 A, B, C のみからなる長さ  N の文字列  S が与えられる。

文字列  S に含まれる連続部分文字列 "ABC" のうち、それが始まる最小の添字を答えよ。"ABC" を含まない場合は -1 を出力せよ。

 

解法 (1):関数 substr() の活用

C++ では、S.substr(i, 3) によって、文字列  S i 文字目  S_{i} から 3 文字分 (つまり、 S_{i}S_{i+1}S_{i+2}) を取り出せる。

よって、for 文を用いて  i = 0, 1, \dots N-3 を見ていって、初めてS.substr(i, 3) が "ABC" となる箇所を求めればよい。

コード

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

int main() {
    int N;
    string S;
    cin >> N >> S;
    
    int res = -1;
    for (int i = 0; i+2 < N; ++i) {
        if (S.substr(i, 3) == "ABC") {
            res = i+1;  // 1-indexed にする
            break;
        }
    }
    cout << res << endl;
}

解法 (2)

仮に関数 substr() を知らなくても、S[i]S[i+1]S[i+2] をすべて見ることでも解ける。

コード

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

int main() {
    int N;
    string S;
    cin >> N >> S;
    
    int res = -1;
    for (int i = 0; i+2 < N; ++i) {
        if (S[i] == 'A' && S[i+1] == 'B' && S[i+2] == 'C') {
            res = i+1;  // 1-indexed にする
            break;
        }
    }
    cout << res << endl;
}