Submission #1223348

#TimeUsernameProblemLanguageResultExecution timeMemory
1223348overwatch9JJOOII 2 (JOI20_ho_t2)C++20
100 / 100
90 ms2064 KiB
#include <bits/stdc++.h>
using namespace std;
map <char, vector <int>> pos;
int n, k;
bool check(int st, int ed) {
    auto it = lower_bound(pos['J'].begin(), pos['J'].end(), st) - pos['J'].begin();
    it += k - 1;
    if (it >= (int)pos['J'].size())
        return false;
    int p = pos['J'][it];
    it = lower_bound(pos['O'].begin(), pos['O'].end(), p) - pos['O'].begin();
    it += k - 1;
    if (it >= (int)pos['O'].size())
        return false;
    p = pos['O'][it];
    it = lower_bound(pos['I'].begin(), pos['I'].end(), p) - pos['I'].begin();
    it += k - 1;
    if (it >= (int)pos['I'].size())
        return false;
    return pos['I'][it] <= ed;
}
int main() {
    cin >> n >> k;
    string s;
    cin >> s;
    s = "0" + s;
    for (int i = 1; i <= n; i++) {
        pos[s[i]].push_back(i);
    }
    int ans = -1;
    for (int i = 1; i <= n; i++) {
        if (s[i] != 'J')
            continue;
        int lo = i, hi = n+1;
        int j, o, I;
        while (lo < hi) {
            int mid = lo + (hi - lo) / 2;
            if (check(i, mid))
                hi = mid;
            else
                lo = mid + 1;
        }
        if (check(i, hi)) {
            if (ans == -1)
                ans = n - k;
            ans = min(ans, (hi - i + 1) - (3 * k));
        }
    }
    cout << ans << '\n';



}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...