結果

問題 No.38 赤青白ブロック
ユーザー fantasiabaetica
提出日時 2018-10-15 16:06:35
言語 C++14
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 218 ms / 5,000 ms
コード長 1,588 bytes
コンパイル時間 591 ms
コンパイル使用メモリ 65,408 KB
実行使用メモリ 5,248 KB
最終ジャッジ日時 2024-10-12 18:31:15
合計ジャッジ時間 6,874 ms
ジャッジサーバーID
(参考情報)
judge3 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 27
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <iostream>
#include <string>
using namespace std;
#define FOR(i,a,b) for(int i=(a); i<(b); i++)

bool check(string str, int kr, int kb){
    int size = str.size();
    FOR(i, 0, size){
        char str_i = str[i];
        if (str_i == 'R'){
            if (i - kr >= 0){
                if (str[i - kr] == 'R') return false;
            } else if (i + kr < size) {
                if (str[i + kr] == 'R') return false;
            }
        } else if (str_i == 'B') {
            if (i - kb >= 0){
                if (str[i - kb] == 'B') return false;
            } else if (i + kb < size) {
                if (str[i + kb] == 'B') return false;
            }
        }
    }
    return true;
}

int main(){
    int kr, kb;
    string str, str_tmp;
    cin >> kr >> kb;
    cin >> str;

    int ans = 0;
    int max_i = 1 << 20;
    // 一部を抜き出した文字列を生成してループを回す
    FOR(i, 0, max_i){
        // iはループのたびに右にシフトするので別の変数にコピー
        int i_tmp = i;
        str_tmp = "";
        // 文字列の生成
        FOR(j, 0, str.size()){
            char str_j = str[j];
            if (str_j != 'W') {
                if ((i_tmp & 1) == 1){
                    str_tmp += str_j;
                }
                i_tmp = i_tmp >> 1;
            } else {
                str_tmp += str_j;
            }
        }
        if (check(str_tmp, kr, kb)){
            if (str_tmp.size() > ans){
                ans = str_tmp.size();
            }
        }
    }
    cout << ans << endl;

    return 0;
}
0