제출 #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...