제출 #222489

#제출 시각아이디문제언어결과실행 시간메모리
222489astoriaJJOOII 2 (JOI20_ho_t2)C++14
13 / 100
2081 ms4172 KiB
#include <bits/stdc++.h> using namespace std; int main(){ int n,k; cin>>n>>k; string s; cin>>s; s = 'K'+s; vector<int> jpos,ipos; int oct[n]; oct[0] = 0; int mpj[n], mpi[n]; memset(mpj,-1,sizeof(mpj)); memset(mpi,-1,sizeof(mpi)); for(int i=1; i<=n; i++){ if(s[i]=='J'){ jpos.push_back(i); mpj[i] = jpos.size()-1;} if(s[i]=='I'){ ipos.push_back(i); mpi[i] = ipos.size()-1;} if(s[i]=='O') oct[i]=oct[i-1]+1; else oct[i]=oct[i-1]; } int min_span = 1e9; int jsz=jpos.size(),isz=ipos.size(); int j_r = jpos[jsz-1], j_l = jpos[jsz-k]; int i_l=-1,i_r=-1; for(int i=j_r+1; i<=n; i++){ if(oct[i-1]-oct[j_r]>=k && s[i]=='I'){ i_l = i; break; } } if(i_l != -1){ if(mpi[i_l] + k <= isz) i_r = ipos[mpi[i_l]+k-1]; } if(i_r!=-1) min_span = min(min_span, i_r-j_l+1); //cout<<min_span<<endl; for(int i=jsz-k-1; i>=0; i--){ j_l = jpos[i]; j_r = jpos[i+k-1]; //cout<<j_l<<' '<<j_r<<endl; if(i_l==-1){ if(oct[ipos[isz-1]-1] - oct[j_r] >= k) i_l=ipos[isz-1]; else continue; } int ival=0; for(int v=i_l; v>0; v--){ if(oct[v-1] - oct[j_r] < k){ ival=v; break;} } for(int v=ival+1; v<=n; v++){ if(s[v] == 'I'){ i_l = v; break;} } if(i_l != -1){ if(mpi[i_l] + k <= isz) i_r = ipos[mpi[i_l]+k-1]; } //cout<<i_l<<' '<<i_r<<endl; //cout<<mpi[i_l]<<endl; if(i_r!=-1) min_span = min(min_span, i_r-j_l+1); //cout<<min_span<<endl; } //cout<<min_span<<endl; if(min_span==1e9) cout<<-1; else cout<<(min_span-(3*k)); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...