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

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

AtCoder ABC 322 B - Prefix and Suffix (灰色, 200 点)

少し FizzBuzz チックな判定問題

問題概要

長さ  N の文字列  S と、長さ  M の文字列  T が与えられる。 N \le M であることが保証される。

  •  S T の prefix でも suffix でもあるとき:0
  •  S T の prefix であるが suffix ではないとき:1
  •  S T の prefix ではないが suffix ではあるとき:2
  •  S T の prefix でも suffix でもないとき:3

を出力せよ。

制約

  •  1 \le N \le M \le 100

解法

判定問題の構造は Fizz Buzz そのもの。よって、次のフラグ変数

  • prefix S T の prefix であるかどうか
  • suffix S T の suffix であるかどうか

を用意したときに、次のように書ける。

    if (prefix && suffix) cout << 0 << endl;
    else if (prefix) cout << 1 << endl;
    else if (suffix) cout << 2 << endl;
    else cout << 3 << endl;

あとは、prefixsuffix の判定を行えばよい。

コード

ここでは、部分文字列を取り出す関数 substr() を活用して判定した。

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

int main() {
    // 入力: T の方が長い
    int N, M;
    string S, T;
    cin >> N >> M >> S >> T;
    
    // S が T の接頭辞であるかどうか
    bool prefix = (T.substr(0, N) == S);
    
    // S が T の接尾辞であるかどうか
    bool suffix = (T.substr(M - N, N) == S);
    
    // 出力
    if (prefix && suffix) cout << 0 << endl;
    else if (prefix) cout << 1 << endl;
    else if (suffix) cout << 2 << endl;
    else cout << 3 << endl;
}