제출 #1280435

#제출 시각아이디문제언어결과실행 시간메모리
1280435hanguyendanghuyJJOOII 2 (JOI20_ho_t2)C++20
100 / 100
7 ms5332 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define pb push_back
#define fi first
#define se second
constexpr ll MAXN=1e6+5,MAXV=3e5,MOD=1e9+7,INF=1e18;
ll n,m,i,j,p,k,ans,dem,pre[MAXN],suf[MAXN];
string s;
ll dist(ll st,ll en){
    return en-st+1-k;
}
int main(){
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
    cin>>n>>k>>s;
    ll cntO=0,cntJ=0,cntI=0;
    queue<ll> O,I,J;
    pre[0]=suf[n+1]=-1;
    for(i=1;i<=n;i++){   
        if(s[i-1]=='J') J.push(i);
        while(J.size()>k) J.pop();
        if(J.size()==k)
            pre[i]=J.front();
        else pre[i]=-1;
    }
    for(i=n;i>=1;i--){
        if(s[i-1]=='I') I.push(i);
        while(I.size()>k) I.pop();
        if(I.size()==k) 
            suf[i]=I.front();
        else suf[i]=-1;
    }
    ll ans=INF;
    for(i=1;i<=n;i++){
        if(s[i-1]=='O') O.push(i);
        while(O.size()>k) O.pop();
        if(O.size()==k){
            ll st=O.front();
            if(suf[i+1]==-1||pre[st-1]==-1) continue;
            ll p=pre[st-1],s=suf[i+1];
            ans=min(ans,dist(p,st-1)+dist(st,i)+dist(i+1,s));
        }
    }
    if(ans==INF){
        cout<<-1;
        return 0;
    }
    cout<<ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...