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 Java8 (OpenJDK 1.8.0) (judge verdict: Wrong Answer)

import java.io.*;
import java.util.*;

public class Main
{
    PrintWriter out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
    BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
    StringTokenizer tok;

    public void go() throws IOException
    {
        ntok();
        int n = ipar();
        int k = ipar();
        ntok();
        char[] s = spar().toCharArray();
        ArrayList<Integer> list1 = new ArrayList<>();
        ArrayList<Integer> list2 = new ArrayList<>();
        int count = 1;
        boolean l = s[0] == 'L';
        for (int i = 1; i < n; i++)
        {
            if (s[i-1] != s[i])
            {
                if (l)
                {
                    list1.add(count);
                }
                else
                {
                    list2.add(count);
                }
                l = s[i] == 'L';
                count = 1;
            }
            else
            {
                count++;
            }
        }
        if (l)
        {
            list1.add(count);
        }
        else
        {
            list2.add(count);
        }
        Collections.sort(list1);
        Collections.sort(list2);
        if (list1.size() > list2.size())
        {
            int sum = 0;
            for (int x : list1)
            {
                sum += x;
            }
            for (int i = 0; i < list2.size() && i < k; i++)
            {
                sum += list2.get(list2.size()-i-1);
            }
            out.println(sum - (list1.size() - Math.min(list2.size(), k)));
        }
        else if (list1.size() < list2.size())
        {
            int sum = 0;
            for (int x : list2)
            {
                sum += x;
            }
            for (int i = 0; i < list1.size() && i < k; i++)
            {
                sum += list1.get(list1.size()-i-1);
            }
            out.println(sum - (list2.size() - Math.min(list1.size(), k)));
        }
        else
        {
            int sum1 = 0;
            for (int x : list1)
            {
                sum1 += x;
            }
            for (int i = 0; i < list2.size() && i < k; i++)
            {
                sum1 += list2.get(list2.size()-i-1);
            }
            int sum2 = 0;
            for (int x : list2)
            {
                sum2 += x;
            }
            for (int i = 0; i < list1.size() && i < k; i++)
            {
                sum2 += list1.get(list1.size()-i-1);
            }
            out.println(Math.max(sum1 - Math.max(list1.size() - Math.min(list2.size(), k), 1), sum2 - Math.max(list2.size() - Math.min(list1.size(), k), 1)));
        }

        out.flush();
        in.close();
    }

    public void ntok() throws IOException
    {
        tok = new StringTokenizer(in.readLine());
    }

    public int ipar()
    {
        return Integer.parseInt(tok.nextToken());
    }

    public int[] iapar(int n)
    {
        int[] arr = new int[n];
        for (int i = 0; i < n; i++)
        {
            arr[i] = ipar();
        }
        return arr;
    }

    public long lpar()
    {
        return Long.parseLong(tok.nextToken());
    }

    public long[] lapar(int n)
    {
        long[] arr = new long[n];
        for (int i = 0; i < n; i++)
        {
            arr[i] = lpar();
        }
        return arr;
    }

    public double dpar()
    {
        return Double.parseDouble(tok.nextToken());
    }

    public String spar()
    {
        return tok.nextToken();
    }

    public static void main(String[] args) throws IOException
    {
        new Main().go();
    }
}