#include <bits/stdc++.h>
using namespace std;
const int INF = 1e9;
int n, k;
string s;
vector<int> J, O, I;
bool check(int mid, int idx, vector<int>& v) { return v[mid] > idx; }
int Bsearch(int l, int r, vector<int>& v, int idx)
{
while(l < r)
{
int mid = (l + r) / 2;
bool ok = check(mid, idx, v);
if(ok) r = mid;
else l = mid + 1;
}
// cout << "Bsearch : " << l << '\n';
return l;
}
int main()
{
cin.tie(NULL)->sync_with_stdio(false);
cin >> n >> k >> s;
for(int i=0;i<s.size();i++)
{
if(s[i] == 'J')
J.push_back(i);
if(s[i] == 'O')
O.push_back(i);
if(s[i] == 'I')
I.push_back(i);
}
// for(int i=0;i<n;i++) cout << i; cout << '\n';
int res = INF;
for(int i=k-1;i<J.size();i++)
{
if(O.size() <= 0 || I.size() <= 0) continue;
int end_J = i;
int start_J = i - k + 1;
int start_O = Bsearch(0, O.size() - 1, O, J[end_J]);
int end_O = start_O + k - 1;
int start_I = Bsearch(0, I.size() - 1, I, O[end_O]);
int end_I = start_I + k - 1;
if(O[start_O] < J[end_J] || I[start_I] < O[end_O] || end_O < start_O || end_I < start_I) continue;
// cout << "J : " << J[end_J] << ' ' << J[start_J] << '\n';
// cout << "O : " << O[end_O] << ' ' << O[start_O] << '\n';
// cout << "I : " << I[end_I] << ' ' << I[start_I] << '\n';
// cout << '\n';
int sum = ((I[end_I] - J[start_J] + 1) - (3 * k)) ;
res = min(res, sum);
}
cout << (res == INF ? -1 : res);
return 0;
}
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |
| # | Verdict | Execution time | Memory | Grader output |
|---|
| Fetching results... |