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

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

AtCoder ABC 364 A - Glutton Takahashi (7Q, 灰色, 100 点)

同じ文字が連続するかどうかを判定するのは、しばしば見かけますね。ラストに注意!

問題概要

"salty" または "sweet" からなる  N 個の文字列  S_{1}, S_{2}, \dots, S_{N} がこの順に与えられる。

"sweet" が 2 回連続すると、それ以降の文字列を受け入れられなくなる。すべての文字列が受け入れられるかどうかを判定せよ。

考えたこと

0-indexed で考えよう。そうすると、文字列は

 S_{0}, S_{1}, S_{2}, \dots, S_{N-3}, S_{N-2}, S_{N-1}

と表されることとなる。判定したいことは、次のように分解できる。


  •  S_{0}, S_{1} がともに "sweet" ならば、"No"
  •  S_{1}, S_{2} がともに "sweet" ならば、"No"
  •  S_{2}, S_{3} がともに "sweet" ならば、"No"
  • ...
  •  S_{N-3}, S_{N-2} がともに "sweet" ならば、"No"

ここで、上記をすべて満たしていれば、最後のペア  S_{N-2}, S_{N-1} については、ともに "sweet" であっても問題ないことに注意しよう(すでに全文字列を受け入れているため)。

あとは、上記のことを実装すればよい。具体的には、 i = 0, 1, \dots, N-3 に対して、 S_{i}, S_{i+1} がともに "sweet" であれば "No" であると判定すればよい。

コード

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

int main() {
    int N;
    cin >> N;
    vector<string> S(N);
    for (int i = 0; i < N; ++i) cin >> S[i];

    bool res = true;
    for (int i = 0; i <= N - 3; ++i) {
        if (S[i] == "sweet" && S[i+1] == "sweet") res = false;
    }

    cout << (res ? "Yes" : "No") << endl;
}