Problem:
Score : 400 points

Problem Statement

There are N people standing in a queue from west to east.

Given is a string S of length N representing the directions of the people.
The i-th person from the west is facing west if the i-th character of S is L, and east if that character of S is R.

A person is happy if the person in front of him/her is facing the same direction.
If no person is standing in front of a person, however, he/she is not happy.

You can perform the following operation any number of times between 0 and K (inclusive):

Operation: Choose integers l and r such that 1 \leq l \leq r \leq N, and rotate by 180 degrees the part of the queue: the l-th, (l+1)-th, ..., r-th persons. That is, for each i = 0, 1, ..., r-l, the (l + i)-th person from the west will stand the (r - i)-th from the west after the operation, facing east if he/she is facing west now, and vice versa.

What is the maximum possible number of happy people you can have?

Constraints

N is an integer satisfying 1 \leq N \leq 10^5.

K is an integer satisfying 1 \leq K \leq 10^5.

|S| = N

Each character of S is L or R.

Input

Input is given from Standard Input in the following format:

N K
S

Output

Print the maximum possible number of happy people after at most K operations.

Sample Input 1

6 1
LRLRRL

Sample Output 1

3

If we choose (l, r) = (2, 5), we have LLLRLL, where the 2-nd, 3-rd, and 6-th persons from the west are happy.

Sample Input 2

13 3
LRRLRLRRLRLLR

Sample Output 2

9

Sample Input 3

10 1
LLLLLRRRRR

Sample Output 3

9

Sample Input 4

9 2
RRRLRLRLL

Sample Output 4

7

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<bits/stdc++.h>
using namespace std;
#define fo(i, k, n) for (int i = k; i <= n; ++ i)
#define fod(i, k, n) for (int i = k; i >= n; -- i)
template <typename T, typename U>
static inline void maxx (T &x, U y) {
  if (x < y) {
    x = y;
  }
}
template <typename T, typename U>
static inline void minn (T &x, U y) {
  if (x > y) {
    x = y;
  }
}
template<typename T>
void read (T &x) {
  x = 0;
  T neg = 1;
  register T c = getchar ();
  if (c == '-') {
    neg = -1;
  }
  while (c < 48 || c > 57) {
    c = getchar ();
  }
  for (; c < 48 || c > 57; c = getchar ());
  for (; c <= 57 && c >= 48; c = getchar ()) {
    x = (x << 3) + (x << 1) + (c & 15);
  }
  x *= neg;
}
template<typename T>
void write (T x) {
  bool neg = 0;
  if (x < 0) {
    x *= -1;
    neg = 1;
  }
  char snum[65];
  int i = 0;
  do {
    snum[++ i] = x % 10 + '0';
    x /= 10;
  }
  while (x);
  //-- i;
  if (neg) {
    putchar ('-');
  }
  while (i > 0) {
    putchar (snum[i --]);
  }
}
///declare
typedef pair <int, int> ii;
bool cmp (ii a, ii b) {
  if (a.second - a.first == b.second - b.first) {
    return a.first < b.first;
  }
  else {
    return a.second - a.first > b.second - b.first;
  }
}
vector <ii> cc;
string s, tmp;
int res = 0, ans, n, k, l, r;
int main () {
  if (fopen ("test.inp", "r")) {
    freopen ("test.inp", "r", stdin);
  }
//  else {
//    freopen(".inp", "r", stdin);
//    freopen(".out", "w", stdout);
//  }

  read (n);
  read (k);
  cin >> s;
  s = '@' + s;
  s += '@';
  l = 1e9;
  r = 1e9;
  fo (i, 1, n) {
    if (s[i] == 'R') {
      if (l != 1e9) cc.push_back (ii (l, r));
      l = 1e9;
    }
    else {
      l = min (l, i);
      r = i;
    }
  }
  //if (l != 1e9) cc.push_back (ii (l, r));
  sort (cc.begin (), cc.end (), cmp);
  tmp = s;
  fo (j, 1, min (k, (int)cc.size ())) {
    fo (i, cc[j - 1].first, cc[j - 1].second) {
      tmp[i] = 'R';
    }
  }
  ans = 0;
  fo (i, 1, n) {
    if (tmp[i] == 'L' && tmp[i - 1] == 'L') {
      ++ ans;
    }
    else if (tmp[i] == 'R' && tmp[i + 1] == 'R') {
      ++ ans;
    }
  }
  res = max (res, ans);
  cc.clear ();
  l = -1e9;
  r = -1e9;
  fod (i, n, 1) {
    if (s[i] == 'L') {
      if (r != -1e9) cc.push_back (ii (l, r));
      r = -1e9;
    }
    else {
      r = max (r, i);
      l = i;
    }
  }
  //if (r != -1e9) cc.push_back (ii (l, r));
  sort (cc.begin (), cc.end (), cmp);
  tmp = s;
  fo (j, 1, min (k, (int)cc.size ())) {//cerr << cc[j].first <<" " << cc[j].second << "\n";
    fo (i, cc[j - 1].first, cc[j - 1].second) {
      tmp[i] = 'L';
    }
  }
  ans = 0;
  fo (i, 1, n) {
    if (tmp[i] == 'L' && tmp[i - 1] == 'L') {
      ++ ans;
    }
    else if (tmp[i] == 'R' && tmp[i + 1] == 'R') {
      ++ ans;
    }
  }
  res = max (res, ans);
  write (res);
}