#include <bits/stdc++.h>
#include <experimental/random>
#include <random>
using namespace std;
using ll = long long;
using ld = long double;
const ll INF = 1e18, MOD = 998244353;
void solve();
signed main() {
#ifdef LOCAL
freopen("input.txt", "r", stdin);
freopen("output.txt", "w", stdout);
#endif
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
ll q = 1;
//cin >> q;
while (q--) {
solve();
}
}
void solve() {
ll n, k;
cin >> n >> k;
string s;
cin >> s;
vector<ll> p1(n + 1), p2(n + 1), p3(n + 1);
for (int i = 0; i < s.size(); i++) {
p1[i + 1] = p1[i], p2[i + 1] = p2[i], p3[i + 1] = p3[i];
if (s[i] == 'J') {
p1[i + 1]++;
}
if (s[i] == 'O') {
p2[i + 1]++;
}
if (s[i] == 'I') {
p3[i + 1]++;
}
}
ll ans = INF;
for (int i = 0; i < n; i++) {
ll st = i;
if (s[st] != 'J') {
continue;
}
ll cnt = 0;
ll l = st - 1, r = n - 1;
if (p1[n] - p1[st] < k) {
continue;
}
while (r - l > 1) {
ll mid = (l + r) / 2;
if (p1[mid + 1] - p1[st] >= k) {
r = mid;
} else {
l = mid;
}
}
cnt += r - st - k + 1;
st = r + 1;
l = st - 1, r = n - 1;
if (p2[n] - p2[st] < k) {
continue;
}
while (r - l > 1) {
ll mid = (l + r) / 2;
if (p2[mid + 1] - p2[st] >= k) {
r = mid;
} else {
l = mid;
}
}
cnt += r - st - k + 1;
st = r + 1;
l = st - 1, r = n - 1;
if (p3[n] - p3[st] < k) {
continue;
}
while (r - l > 1) {
ll mid = (l + r) / 2;
if (p3[mid + 1] - p3[st] >= k) {
r = mid;
} else {
l = mid;
}
}
cnt += r - st - k + 1;
ans = min(ans, cnt);
}
if (ans == INF) {
cout << -1;
} else {
cout << ans;
}
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |