Problem:
Score : 1300 points

Problem Statement

Takahashi has a string S of length N consisting of lowercase English letters.
On this string, he will perform the following operation K times:

Let T be the string obtained by reversing S, and U be the string obtained by concatenating S and T in this order.

Let S' be some contiguous substring of U with length N, and replace S with S'.

Among the strings that can be the string S after the K operations, find the lexicographically smallest possible one.

Constraints

1 \leq N \leq 5000

1 \leq K \leq 10^9

|S|=N

S consists of lowercase English letters.

Input

Input is given from Standard Input in the following format:

N K
S

Output

Print the lexicographically smallest possible string that can be the string S after the K operations.

Sample Input 1

5 1
bacba

Sample Output 1

aabca

When S=bacba, T=abcab, U=bacbaabcab, and the optimal choice of S' is S'=aabca.

Sample Input 2

10 2
bbaabbbaab

Sample Output 2

aaaabbaabb

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

#include <bits/stdc++.h>

#ifdef HOME
#define db(x) cerr << #x << " = " << x << endl
#define db3(x, y, z) cerr << "(" << #x << ", " << #y << ", " << #z << ") = (" << x << ", " << y << ", " << z << ")" << endl
#define db2(x, y) cerr << "(" << #x << ", " << #y << ") = (" << x << ", " << y << ")" << endl
#define dbv(a) cerr << #a << " = "; for (auto xxx: a) cerr << xxx  << " "; cerr << endl
#else
#define db(x) ;
#define db3(x, y, z) ;
#define db2(x, y) ;
#define dbv(a) ;
#endif

using namespace std;
typedef long long ll;
typedef double dbl;


const int INF = (int)1.01e9;

string solve(int n, int k, string s) {
    if (k >= 40) return string(n, *min_element(s.begin(), s.end()));

    auto get_nt = [&](const string &t) {
        string nt = "";
        int z = n - 1;
        while (z > 0 && t[z - 1] == t[z]) z--;

        for (int j = z; j < n; j++) nt += t[j];
        for (int j = n - 1; (int)nt.length() < n; j--) nt += t[j];
        return nt;
    };

    string ans(n, 'z');
    for (int i = 0; i < n; i++) {
        string t = s.substr(i);
        for (int j = n - 1; j >= 0; j--) if ((int)t.length() < n) t += s[j];

        for (int it = 1; it < k - 1; it++) {
            auto nt = get_nt(t);
            reverse(nt.begin(), nt.end());
            t = nt;
        }
        if (k > 1) {
            t = get_nt(t);
        }
        ans = min(ans, t);
    }
    return ans;
}

int main() {
#ifdef HOME
    assert(freopen("in", "r", stdin));
#endif

    int n, k;
    string s;
    while (cin >> n >> k >> s) {
        cout << solve(n, k, s) << endl;
    }

#ifdef HOME
    cerr << "time: " << clock() * 1.0 / CLOCKS_PER_SEC << endl;
#endif
}