Official
C - Prefix and Suffix Editorial
by
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\) の 接頭辞 であるとは、\(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: