이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define vi vector<int>
#define endl '\n'
const int N = (int)1e5+5;
void Solve(){
int n , k; cin>>n>>k;
string s; cin>>s;
deque<char> st;
for(auto &i : s){
st.push_back(i);
}
while (!st.empty() and st.front()!='J'){
st.pop_front();
}
while(!st.empty() and st.back() != 'I'){
st.pop_back();
}
if(st.empty()){
cout<<-1<<endl;
return;
}
s = " " + s;
vi prej(n+1) , prei(n+1) , preo(n+1);
for(int i = 1 ; i <= n ; i++){
prej[i] = prej[i-1] + (s[i]=='J');
prei[i] = prei[i-1] + (s[i]=='I');
preo[i] = preo[i-1] + (s[i]=='O');
}
// cout<<"j"<<" ";
// for(int i = 1 ; i<= n ; i++){
// cout<<prej[i]<<" ";
// }
// cout<<endl;
// cout<<"o"<<" ";
// for(int i = 1 ; i<= n ; i++){
// cout<<preo[i]<<" ";
// }
// cout<<endl;
// cout<<"i"<<" ";
// for(int i = 1 ; i<= n ; i++){
// cout<<prei[i]<<" ";
// }
// cout<<endl;
int ans = 1e18;
for (int i = 1; i <= n; ++i) {
if (s[i]=='J'){
int j = lower_bound(prej.begin(), prej.end(),prej[i-1]+k) - prej.begin();
// cout<<i<<" "<<j<<" " << preo[j]+k <<endl;
if (j>=n+1)continue;
int o = lower_bound(preo.begin(), preo.end(),preo[j]+k) - preo.begin();
// cout<<j<<" "<<o<<endl;
if(o>=n+1) continue;
int ii = lower_bound(prei.begin(), prei.end(),prei[o]+k) - prei.begin();
if(ii>=n+1) continue;
int temp = (ii-i+1 - (3*k));
// cout<<temp<<endl;
ans = min(ans,temp);
}
}
if(ans>=1e18){
cout<<-1<<endl;
return;
}
cout<<ans<<endl;
}
int32_t main(){
Solve();
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |