Submission #64781596


Source Code Expand

Copy
#ifndef _Alignof
#define _Alignof __alignof__
#endif
#include <bits/stdc++.h>
#include <numeric>
#define LOOP(n) for (int _i = 0; _i < (n); _i++)
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define RREP(i, n) for (int i = (n); i >= 0; --i)
#define FOR(i, r, n) for (int i = (r); i < (n); ++i)
#define ALL(obj) begin(obj), end(obj)
#define yes "Yes"
#define no "No"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ll,int> pli;
typedef pair<int,ll> pil;
typedef vector<vector<int>> vvi;
typedef vector<vector<ll>> vvl;
const vector<char> alpha = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
 
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
#ifndef _Alignof
#define _Alignof __alignof__
#endif
#include <bits/stdc++.h>
#include <numeric>
#define LOOP(n) for (int _i = 0; _i < (n); _i++)
#define REP(i, n) for (int i = 0; i < (n); ++i)
#define RREP(i, n) for (int i = (n); i >= 0; --i)
#define FOR(i, r, n) for (int i = (r); i < (n); ++i)
#define ALL(obj) begin(obj), end(obj)
#define yes "Yes"
#define no "No"
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
typedef pair<ll,int> pli;
typedef pair<int,ll> pil;
typedef vector<vector<int>> vvi;
typedef vector<vector<ll>> vvl;
const vector<char> alpha = {'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'};
int dx[4] = {0, 1, 0, -1};
int dy[4] = {1, 0, -1, 0};
const ll INF = 1e18;

struct SegmentInfo {
    int startPos;          // 元文字列でのセグメント開始位置
    int length;            // セグメントの長さ
    vector<int> pref;      // pref[i] = [0..i-1] で置ける最大'o'数
    vector<int> suff;      // suff[i] = [i..L-1]  で置ける最大'o'数
    int maxWithoutForce;   // セグメント全体[0..L-1] で置ける'o'の最大数
};

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int N;
    long long K;  // K が大きい場合もあるので long long
    cin >> N >> K;
    string S;
    cin >> S;

    // まず、強制'o'の個数を数えつつ、隣に'?'があれば'.'に変換
    vector<char> T(N);
    for(int i=0; i<N; i++){
        T[i] = S[i];
    }

    long long forced_o_count = 0;
    for(int i=0; i<N; i++){
        if(T[i] == 'o'){
            forced_o_count++;
            // 左右の'?'を'.'に変える
            if(i > 0 && T[i-1] == '?'){
                T[i-1] = '.';
            }
            if(i < N-1 && T[i+1] == '?'){
                T[i+1] = '.';
            }
        }
    }
    long long needed = K - forced_o_count;  // "残り"必要な'o'の数

    vector<SegmentInfo> segments;
    vector<int> segIndexOf(N, -1);  // i番目がどのセグメントに属するか(なければ-1)
    {
        int i = 0;
        int segId = 0;
        while(i < N){
            if(T[i] == '?'){
                int st = i;
                while(i < N && T[i] == '?'){
                    i++;
                }
                int en = i - 1;
                int length = en - st + 1;

                SegmentInfo seg;
                seg.startPos = st;
                seg.length = length;
                seg.pref.resize(length+1);
                seg.suff.resize(length+1);


                seg.pref[0] = 0; 
                if(length >= 1) seg.pref[1] = 1; 
                for(int x=2; x<=length; x++){
                    seg.pref[x] = max(seg.pref[x-1], seg.pref[x-2] + 1);
                }

                seg.suff[length] = 0;
                if(length >= 1) seg.suff[length-1] = 1;
                for(int x=length-2; x>=0; x--){
                    seg.suff[x] = max(seg.suff[x+1], 1 + ((x+2 <= length)? seg.suff[x+2]:0));
                }

                // セグメント全体の最大'o'数(強制なし) = pref[length]
                seg.maxWithoutForce = seg.pref[length];

                // segIndexOf を設定
                for(int pos = st; pos <= en; pos++){
                    segIndexOf[pos] = segId;
                }
                segments.push_back(seg);
                segId++;
            }
            else {
                i++;
            }
        }
    }

    long long sum_max = 0;
    for(auto &seg : segments){
        sum_max += seg.maxWithoutForce;
    }


    auto getMaxIfDot = [&](const SegmentInfo &seg, int j){
        int L = seg.length;
        int leftVal = seg.pref[j];       // [0..j-1]
        int rightVal = (j+1 <= L)? seg.suff[j+1] : 0;  // [j+1..L-1]
        return leftVal + rightVal;
    };
    auto getMaxIfO = [&](const SegmentInfo &seg, int j){
        // j番目を'o'固定 => +1 しつつ j-1, j+1 は使えない
        // => 左[0..j-2], 右[j+2..L-1] の最大 'o'数 +1
        int L = seg.length;
        int leftVal = 0;
        if(j-1 >= 0){
            leftVal = seg.pref[j-1]; // [0..(j-1)-1] => [0..j-2]
        }
        int rightVal = 0;
        if(j+2 <= L){
            rightVal = seg.suff[j+2];  // [j+2..L-1]
        }
        return 1 + leftVal + rightVal;
    };

    // 実際に各文字を決めていく
    for(int i=0; i<N; i++){
        if(T[i] == 'o' || T[i] == '.'){
            // 既に決まっているので変更なし
            continue;
        }
        // ここに来るのは T[i] == '?'
        int segId = segIndexOf[i];
        auto &seg = segments[segId];
        int j = i - seg.startPos;  // セグメント内での位置

        long long segMax0 = seg.maxWithoutForce;  // そのセグメントを強制なしで置いたときの最大個数
        long long sumOthers = sum_max - segMax0;  // 他セグメントの最大合計

        // '.' にする場合
        // 範囲 [0.. getMaxIfDot(j)]
        long long maxIfDot = getMaxIfDot(seg, j); 
        bool can_be_dot = false;
        if(0 <= needed && needed <= sumOthers + maxIfDot){
            // 下限は0なので needed>=0 でOK
            can_be_dot = true;
        }


        long long maxIfO = getMaxIfO(seg, j);
        bool can_be_o = false;
        if(1 <= needed && needed <= sumOthers + maxIfO){
            can_be_o = true;
        }

        // 両方判定
        if(can_be_o && !can_be_dot){
            T[i] = 'o';
        }
        else if(!can_be_o && can_be_dot){
            T[i] = '.';
        }
        else if(can_be_o && can_be_dot){
            // 両方アリ
            T[i] = '?';
        }
    }
    cout << string(T.begin(), T.end()) << "\n";
    return 0;
}

Submission Info

Submission Time
Task D - Logical Filling
User una_o0
Language C++ 17 (gcc 12.2)
Score 400
Code Size 5977 Byte
Status AC
Exec Time 9 ms
Memory 8240 KiB

Judge Result

Set Name Sample All
Score / Max Score 0 / 0 400 / 400
Status
AC × 3
AC × 43
Set Name Test Cases
Sample 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt
All 00_sample_00.txt, 00_sample_01.txt, 00_sample_02.txt, 01_random_00.txt, 01_random_01.txt, 01_random_02.txt, 01_random_03.txt, 01_random_04.txt, 01_random_05.txt, 01_random_06.txt, 01_random_07.txt, 01_random_08.txt, 01_random_09.txt, 01_random_10.txt, 01_random_11.txt, 01_random_12.txt, 01_random_13.txt, 01_random_14.txt, 01_random_15.txt, 01_random_16.txt, 01_random_17.txt, 01_random_18.txt, 01_random_19.txt, 01_random_20.txt, 01_random_21.txt, 01_random_22.txt, 01_random_23.txt, 01_random_24.txt, 01_random_25.txt, 01_random_26.txt, 01_random_27.txt, 01_random_28.txt, 01_random_29.txt, 01_random_30.txt, 01_random_31.txt, 01_random_32.txt, 01_random_33.txt, 01_random_34.txt, 01_random_35.txt, 01_random_36.txt, 01_random_37.txt, 01_random_38.txt, 01_random_39.txt
Case Name Status Exec Time Memory
00_sample_00.txt AC 1 ms 3488 KiB
00_sample_01.txt AC 1 ms 3488 KiB
00_sample_02.txt AC 1 ms 3636 KiB
01_random_00.txt AC 3 ms 4396 KiB
01_random_01.txt AC 8 ms 7356 KiB
01_random_02.txt AC 8 ms 7260 KiB
01_random_03.txt AC 1 ms 3560 KiB
01_random_04.txt AC 4 ms 5012 KiB
01_random_05.txt AC 4 ms 4960 KiB
01_random_06.txt AC 6 ms 6996 KiB
01_random_07.txt AC 6 ms 6160 KiB
01_random_08.txt AC 2 ms 3768 KiB
01_random_09.txt AC 6 ms 6184 KiB
01_random_10.txt AC 5 ms 6264 KiB
01_random_11.txt AC 5 ms 6248 KiB
01_random_12.txt AC 5 ms 6288 KiB
01_random_13.txt AC 5 ms 6200 KiB
01_random_14.txt AC 5 ms 6240 KiB
01_random_15.txt AC 5 ms 6248 KiB
01_random_16.txt AC 5 ms 6184 KiB
01_random_17.txt AC 5 ms 6304 KiB
01_random_18.txt AC 5 ms 6232 KiB
01_random_19.txt AC 5 ms 6216 KiB
01_random_20.txt AC 3 ms 4592 KiB
01_random_21.txt AC 3 ms 4540 KiB
01_random_22.txt AC 5 ms 7516 KiB
01_random_23.txt AC 1 ms 3572 KiB
01_random_24.txt AC 1 ms 3432 KiB
01_random_25.txt AC 1 ms 3636 KiB
01_random_26.txt AC 1 ms 3512 KiB
01_random_27.txt AC 9 ms 8088 KiB
01_random_28.txt AC 8 ms 8240 KiB
01_random_29.txt AC 8 ms 8140 KiB
01_random_30.txt AC 8 ms 8108 KiB
01_random_31.txt AC 8 ms 8192 KiB
01_random_32.txt AC 8 ms 8040 KiB
01_random_33.txt AC 9 ms 8076 KiB
01_random_34.txt AC 8 ms 8132 KiB
01_random_35.txt AC 8 ms 8076 KiB
01_random_36.txt AC 8 ms 8004 KiB
01_random_37.txt AC 5 ms 6252 KiB
01_random_38.txt AC 5 ms 7548 KiB
01_random_39.txt AC 5 ms 7456 KiB


2025-06-06 (Fri)
20:38:58 +09:00