이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
using namespace std;
const int MAXN = 200010;
int J[MAXN], O[MAXN], I[MAXN];
int N, K;
string s;
int bb(int v[], int x){
// achar ultimo cara i, v[i] < x
if(v[0] >= x) return 0;
int ans = 0;
int pot = (1 << 30);
while(pot){
int mans = ans + pot;
if(mans < N && v[mans] < x) ans = mans;
pot /= 2;
}
if(ans + 1 == N) return -1;
else return ans + 1;
}
int solveI(int i){
if(i == N) return -1;
int prev = I[i - 1];
int nxt = bb(I, prev + K);
if(nxt == -1) return -1;
int cost = (nxt - i + 1) - K;
return cost;
}
int solveO(int i){
if(i == N) return -1;
int prev = O[i - 1];
int nxt = bb(O, prev + K);
if(nxt == -1) return -1;
int cost = (nxt - i + 1) - K;
int x;
if((x = solveI(nxt + 1)) == -1) return -1;
return cost + x;
}
int solveJ(int i){ // starting from i
int prev = 0;
if(i > 0) prev = J[i - 1];
int nxt = bb(J, prev + K);
if(nxt == -1) return -1;
int cost = (nxt - i + 1) - K;
int x;
if((x = solveO(nxt + 1)) == -1) return -1;
return cost + x;
}
int32_t main(){
cin.tie(NULL)->sync_with_stdio(false);
cin >> N >> K;
cin >> s;
for(int i = 0; i < N; ++i){
J[i] = (s[i] == 'J');
O[i] = (s[i] == 'O');
I[i] = (s[i] == 'I');
if(i){
J[i] += J[i - 1];
O[i] += O[i - 1];
I[i] += I[i - 1];
}
}
int ans = INT_MAX;
for(int i = 0; i < N; ++i){
int x = solveJ(i);
if(x == -1) break;
// cout << i << " " << x << "\n";
ans = min(ans, x);
}
cout << ((ans == INT_MAX)? -1 : ans) << "\n";
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |