Yuulis.log

トンネルを抜けるとそこは参照エラーであった。

【AtCoder】ABC 346 B - Piano | 茶コーダーが解くAtCoder

atcoder.jp

実行時間制限: 2 sec / メモリ制限: 1024 MB / Difficulty: 251

問題概要

文字列wbwbwwbwbwbwを無限に繰り返してできる文字列を  S とする。  S の連続部分文字列であって、  W 個のw B 個のbからなるものが存在するかを判定せよ。

制約

  •  W, B は整数
  •  0 \leq W, B \leq 100
  •  W + B \geq 1

考察

 S を無限個結合した文字列  T を考える。条件を満たす連続部分文字列を探すので、まずは始点の全探索をしよう。  T の周期は12なので、12通りの始点が考えられる。

次に、 T の各文字の判定をすることになるが、  T は無限に続くのでどこかで打ち切らなければならない。ここでポイントなのが、 T にはwbしか現れない点だ。つまり、  T W + B 文字目までを探索して条件に合致しなければ打ち切ってしまえばいい。

実装においては  T に対して探索をしても良いし、  T の周期が12なので、インデックスを12の剰余で扱ってもよい。

コード

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

#define rep(i, start, end) for (ll i = (start); i < (ll)(end); i++)

// ======================================== //

int main()
{
    int W, B;
    cin >> W >> B;
    string S = "wbwbwwbwbwbw";
    int l = S.size();

    rep(i, 0, l)
    {
        int w_cnt = 0, b_cnt = 0;
        rep(j, 0, W + B)
        {
            if (S[(i + j) % l] == 'w')
                w_cnt++;
            else
                b_cnt++;
        }

        if (w_cnt == W && b_cnt == B)
        {
            cout << "Yes" << endl;
            return 0;
        }
    }

    cout << "No" << endl;
}

atcoder.jp

実装時間: 15分