/*
可以发现一个性质:连续两个相同色块永远不会变色
继而可以发现,这个色段每次迭代都向左向右拓展长度1,直到撞上其他扩张的色段
所以预处理出所有连续色段,然后对于所有不在色段里的点,我们可以预测其最终的颜色:
其本身每次迭代改变一次颜色,如果k>= 离其最近的那个色段到其的距离Len,那么其就会被那个色段覆盖
那么就要预处理出这些点两侧最近的色段距离和颜色
由于是环形,所以扩张两倍即可来求边界
*/
#include<bits/stdc++.h>
#include<vector>
using namespace std;
#define N 400005
int f[N],c[N],k,n,L[N],R[N];
char s[N];
int main(){
cin>>n>>k;
memset(c,0x3f,sizeof c);
scanf("%s",s+1);
for(int i=1;i<=n;i++)
if(s[i]=='B')c[i]=c[i+n]=0;
else c[i]=c[i+n]=1;
c[0]=c[n];c[2*n+1]=c[1];
for(int i=1;i<=2*n;i++)
if(c[i]==c[i-1] || c[i]==c[i+1])
f[i]=1;//连续点标记为1
//特判没有连续段,都是连续段
int cnt=0;
for(int i=1;i<=n;i++)cnt+=f[i];
if(cnt==0){//无连续段
if(k%2==0){
printf("%s",s+1);
}
else {
for(int i=1;i<=n;i++)
if(s[i]=='B')cout<<'W';
else cout<<'B';
puts("");
}
return 0;
}
else if(cnt==n){
printf("%s",s+1);
return 0;
}
//处理左边界
int p=0;
while(f[p+1]!=1)++p;//找到第一个连续色段
for(int i=p+1;i<=2*n;i++)
if(!f[i])L[i]=p;
else p=i;
//处理右边界
p=2*n+1;
while(f[p-1]!=1)--p;
for(int i=p-1;i>=1;i--)
if(!f[i])R[i]=p;
else p=i;
//010011,010011
for(int i=1;i<=n;i++){//回到环形上
if(!f[i] && L[i]==0)
L[i]=L[i+n];
if(!f[i] && R[i]>n)
R[i]-=n;
}
for(int i=1;i<=n;i++)
if(f[i]){
cout<<s[i];
}
else {
int disl,disr;
if(L[i]>i)
disl=n-L[i]+i;
else
disl=i-L[i];
if(R[i]<i)
disr=R[i]+n-i;
else
disr=R[i]-i;
int dis=min(disl,disr);
if(dis<=k){
if(disl<disr){//被左侧覆盖
if(disl<i)
cout<<s[i-disl];
else cout<<s[i+n-disl];
}
else {//被右侧覆盖
if(i+disr<=n)
cout<<s[i+disr];
else cout<<s[i+disr-n];
}
}
else {
int now=(c[i]+k)%2;
if(now==0)cout<<"B";
else cout<<"W";
}
}
puts("");
}