#include <bits/stdc++.h>
using namespace std;
int N, K;
pair<long long int,int> memo[5100];
long long int pre[5100][5100];
int in[10100];
int bin[10100];
string s;
long long int inf = 1.1e18;
int main(){
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	
	cin >> N >> K;
	cin >> s;
	
	int a = 1;
	int b = 1;
	
	for(int i = 0; i < N * 2; i++){
		if(s[i] == 'A'){
			bin[a] = b;
			a++;
		}
		else{
			b++;
		}
	}
	
	
	for(int i = 1; i <= N; i++){
		pre[i][i - 1] = 0;
		
		for(int j = i; j <= N; j++){
			pre[i][j] = pre[i][j - 1] + max(0,bin[j] - i );
		}
	}
	
	long long int s = 0;
	long long int e = 1e13;
	
	while(true){	
		long long int m = (s + e)/2;
		
		for(int i = 0; i <= N; i++){
			memo[i] = {inf,1};
		}
		memo[0] = {0,0};
		
		for(int i = 1; i <= N; i++){
			for(int k = i; k >= 1; k--){
				memo[i] = min(memo[i], {memo[k - 1].first + pre[k][i] + m, memo[k - 1].second + 1} );
			}
		}
		
		/*for(int i = 1; i <= N; i++){
			printf("%lld\n",memo[i][K]);
		}*/
		
		if(s == e) break;
		
		if(memo[N].second > K){
			s = m + 1;
		}
		else{
			e = m;
		}
	}
	
	
	printf("%lld",memo[N].first - memo[N].second * s);
}
 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |