Official

C - Prefix and Suffix Editorial by Nyaan


この問題は 接頭辞(prefix)接尾辞(suffix) がテーマになっている問題です。接頭辞・接尾辞という概念は他の問題でも多く登場するので、知らなかった人は覚えておくとよいでしょう。

問題文にある通り、接頭辞と接尾辞とは次に説明する文字列のことをいいます。

  • 文字列 \(S, T\) がある。\(S\) の長さを \(N\) とする。このとき、
    • \(S\)\(T\)接頭辞 であるとは、\(T\) のはじめ \(N\) 文字からなる文字列が \(S\) と一致することをいう。
    • \(S\)\(T\)接尾辞 であるとは、\(T\) の後ろ \(N\) 文字からなる文字列が \(S\) と一致することをいう。

この問題は 「\(S\)\(T\) の接頭辞であるか?/接尾辞であるか?」を判定できれば、それに対応する番号を出力することで正解することができます。

この判定の部分は for 文を利用すれば上手く判定できます。たとえば接頭辞の方は、

  • \(S\)\(1\) 文字目と \(T\)\(1\) 文字目が一致するか?
  • \(S\)\(2\) 文字目と \(T\)\(2\) 文字目が一致するか?
  • \(\vdots\)
  • \(S\)\(N\) 文字目と \(T\)\(N\) 文字目が一致するか?

を全て調べて、すべての条件が正しければ \(S\)\(T\) の接頭辞で、そうでなければ接頭辞ではないとわかります。(接尾辞についても同様に判定できます。)

C++ による実装例は次の通りです。

#include <iostream>
#include <string>
using namespace std;

int main() {
  int N, M;
  string S, T;
  cin >> N >> M >> S >> T;

  int is_prefix = true;
  for (int i = 0; i < N; i++) {
    if (S[i] != T[i]) is_prefix = false;
  }
  int is_suffix = true;
  for (int i = 0; i < N; i++) {
    if (S[i] != T[M - N + i]) is_suffix = false;
  }

  if (is_prefix) {
    cout << (is_suffix ? 0 : 1) << endl;
  } else {
    cout << (is_suffix ? 2 : 3) << endl;
  }
}

posted:
last update: