#include <bits/stdc++.h>
#include <boost/multiprecision/cpp_int.hpp>
using namespace std;

//#define int long long
using bll = boost::multiprecision::cpp_int;
using ll = long long;
//constexpr int INF = 1e9;//INT_MAX=(1<<31)-1=2147483647
constexpr ll INF = (ll)1e18;//(1LL<<63)-1=9223372036854775807
constexpr ll MOD = (ll)1e9 + 7;
constexpr double EPS = 1e-9;
constexpr int dx[4]={1,0,-1,0};
constexpr int dy[4]={0,1,0,-1};
#ifdef LOCAL_ENV
	#define debug(var) std::cout<<#var" = "<<var<<std::endl
#else
	#define debug(var)
#endif
#define p(var) std::cout<<var<<std::endl
#define PI (acos(-1))
#define rep(i, n)   for(ll i=0, i##_length=(n); i< i##_length; ++i)
#define repeq(i, n) for(ll i=1, i##_length=(n); i<=i##_length; ++i)
#define all(v) (v).begin(), (v).end()
#define uniq(v) (v).erase(unique((v).begin(), (v).end()), (v).end());
template<typename T> inline T power(T x, T n){ return n ? power(x*x%MOD,n/2)*(n%2?x:1)%MOD : 1; }
template<typename T> inline T gcd(T a, T b) { return b ? gcd(b,a%b) : a; }
template<typename T> inline T lcm(T a, T b) { return a / gcd(a,  b) * b; }
template<typename T1, typename T2>inline bool chmax(T1 &a, T2 b) { return a < b && (a = b, true); }
template<typename T1, typename T2>inline bool chmin(T1 &a, T2 b) { return a > b && (a = b, true); }
template<typename T1, typename T2> ostream& operator<<(ostream& s, const pair<T1, T2>& p) {return s << "(" << p.first << ", " << p.second << ")";}
template<typename T> ostream& operator<<(ostream& s, const vector<T>& v) {
	for (int i = 0, len = v.size(); i < len; ++i){
		s << v[i]; if (i < len - 1) s << "\t";
	}
	return s;
}
template<typename T> ostream& operator<<(ostream& s, const vector< vector<T> >& vv) {
	for (int i = 0, len = vv.size(); i < len; ++i){
		s << vv[i] << endl;
	}
	return s;
}
template<typename T1, typename T2> ostream& operator<<(ostream& s, const map<T1, T2>& m) {
	s << "{" << endl;
	for (typeof(m.begin()) itr = m.begin(); itr != m.end(); ++itr){
		s << "\t" << (*itr).first << " : " << (*itr).second << endl;
	}
	s << "}" << endl;
	return s;
}

/*-----8<-----8<-----*/


class UnionFind {
public:
	vector<ll> v;
	UnionFind(size_t size) : v(size, -1) {}

	ll root(ll x) {
		return (v[x] < 0 ? x : v[x] = root(v[x]));
	}

	bool is_root(ll x) {
		return x == root(x);
	}

	bool is_same(ll x, ll y) {
		return root(x) == root(y);
	}

	bool unite(ll x, ll y) {
		x = root(x);
		y = root(y);
		if (x == y) return false;
		if (v[x] > v[y]) swap(x, y);
		v[x] += v[y];
		v[y] = x;
		return true;
	}

	ll size(ll x) {
		return -v[root(x)];
	}
};




constexpr ll N_MAX = 100000;
constexpr ll K_MAX = 100000;

ll N, KK;
string S;

void input() {
	scanf("%lld%lld", &N, &KK);
	cin>>S;
}

void solve() {
	
	vector<ll> a;
	char t=S[0];
	ll c=0;
	rep(i,N){
		if(S[i]==t){
			c++;
		}else{
			if(i==0)c=1;
			a.push_back(c);
			c=1;
			t=S[i];
		}
	}
	a.push_back(c);
	debug(a);

	ll k=2*KK+1;

	if(a.size()<=k){
		ll ans=accumulate(all(a),0LL);
		debug(ans);
		p(ans-1);
		return;
	}

	ll tx=0;
	rep(i,k)tx+=a[i];
	ll maxval=tx;
	ll maxindex=0;
	for(ll i=k,alen=a.size(); i<alen; i++){
		tx+=a[i];
		tx-=a[i-k];
		if(chmax(maxval,tx)){
			maxindex=i-k+1;
		}
	}	
	debug(maxval);
	debug(maxindex);
	debug(k);


	////
	vector<ll> b;
	ll tt=0;
	rep(i,a.size()){
		if(maxindex<=i && i<maxindex+k)tt+=a[i];
		else b.push_back(a[i]);
	}
	b.push_back(tt);
	debug(b);
	ll ans = 0;
	rep(i,b.size()){
		ans+=b[i]-1;
	}
	printf("%lld\n", ans);
}

signed main() {
	input();
	solve();
	return 0;
}


Measured memory_bytes: 2676