제출 #1324074

#제출 시각아이디문제언어결과실행 시간메모리
1324074sh_qaxxorov_571JJOOII 2 (JOI20_ho_t2)C++20
100 / 100
9 ms1808 KiB
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

using namespace std;

/**
 * JOI 2020 Final - JOI-string
 * Vaqt murakkabligi: O(N)
 */
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int N, K;
    string S;
    cin >> N >> K >> S;

    vector<int> posJ, posO, posI;
    for (int i = 0; i < N; i++) {
        if (S[i] == 'J') posJ.push_back(i);
        else if (S[i] == 'O') posO.push_back(i);
        else if (S[i] == 'I') posI.push_back(i);
    }

    // Agar harflar yetarli bo'lmasa
    if (posJ.size() < K || posO.size() < K || posI.size() < K) {
        cout << -1 << endl;
        return 0;
    }

    int min_op3 = 2e9;

    // Har bir mumkin bo'lgan K ta 'J' blokidan boshlaymiz
    for (int i = 0; i + K <= posJ.size(); i++) {
        int endJ = posJ[i + K - 1];

        // 'J' lardan keyin keladigan birinchi 'O' indeksini topamiz
        auto itO = lower_bound(posO.begin(), posO.end(), endJ);
        int idxO = distance(posO.begin(), itO);
        
        if (idxO + K > posO.size()) continue;
        int endO = posO[idxO + K - 1];

        // 'O' lardan keyin keladigan birinchi 'I' indeksini topamiz
        auto itI = lower_bound(posI.begin(), posI.end(), endO);
        int idxI = distance(posI.begin(), itI);

        if (idxI + K > posI.size()) continue;
        int endI = posI[idxI + K - 1];

        // Umumiy oraliq: [posJ[i], endI]
        // Bu oraliqdagi barcha keraksiz belgilar Op3 orqali o'chiriladi
        int current_total_len = endI - posJ[i] + 1;
        min_op3 = min(min_op3, current_total_len - 3 * K);
    }

    if (min_op3 > N) cout << -1 << endl;
    else cout << min_op3 << endl;

    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...