Submission #906425

#TimeUsernameProblemLanguageResultExecution timeMemory
906425vjudge1JJOOII 2 (JOI20_ho_t2)C++17
100 / 100
35 ms8768 KiB
#include<bits/stdc++.h>
#include<queue>
#define ll long long
using namespace std;

ll n, k, dem = 0, cnt[5], pfs[(int)2e5+5][5];

char a[5] = {'J', 'O', 'I'};

string s;

ll bs(ll x, ll y, ll l, ll r){
	
	ll mid;
	
	while(l <= r){
		
		mid = (l+r)/2;
		
		if(pfs[mid][y] >= x + k) r = mid-1;
		
		else l = mid+1;
	}
	return l;
}

int main(){

	ios_base::sync_with_stdio(0);
	
	cin.tie(0);
	
	cin>>n>>k>>s;
	
	s = " "+s;
	
	for(int i = 1; i <= n; i++){
		
		for(int j = 0; j < 3; j++){
			
			if(s[i] == a[j]){
				
				pfs[i][j] = pfs[i-1][j] + 1;
			}
			
			else pfs[i][j] = pfs[i-1][j];
		}
	}
	
//	for(int i = 1; i <= n; i++) cout<<pfs[i][0]<<" ";
//	
//	cout<<endl;
	
	ll start = 1, i, j, ans = 0, x, ds = 1e18;
	
	bool flag = true;
	
	while(flag == true){
		
		i = start;
		
//		cout<<i<<endl;
		
		ans = 0; x = 0;
		
		for(int t = 0; t < 3; t++){
			
			i = bs((-1)*k+1, t, i, n);
			
			if(t == 0) x = i-1;
			
			j = bs(pfs[i-1][t], t, i, n);
			
//			cout<<i<<" "<<j<<" ";
			
			ans += i - x - 1 + j - i + 1 - k;
			
//			cout<<ans<<endl;
			
			if(i > n || j > n){
				
				flag = false;
				
				ans = 1e18;
				
//				cout<<"!! "<<i<<" "<<j;
				
				break;
			}
			
			i = j+1;
			
			x = j;
		}
//		cout<<ans<<endl<<endl;
		
		ds = min(ds, ans);
		
		if(flag == false) break;
		
//		if(start == 3) break;
		
		start++;
	}
	if(ds != 1e18) cout<<ds;
	
	else cout<<-1;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...