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: Accepted)

#include <bits/stdc++.h>
using namespace std;
#define mod 998244353
#define MOD 1000000007
#define inf 0x3f3f3f3f
#define linf 0x3f3f3f3f3f3f3f3fll
typedef long long ll;
typedef pair<int,int> pii;
typedef unsigned long long ull;
string ans;
void dfs(int lft,string res)
{
	if(!lft)
	{
		if(ans=="")ans=res;
		else ans=min(ans,res);
		return;
	}
	string t=res;
	reverse(t.begin(),t.end());
	t=res+t;
	for(int i=0;i<=res.size();i++)
		dfs(lft-1,t.substr(i,res.size()));
}
int main()
{
	int n,k;
	string s;
	cin>>n>>k;
	cin>>s;
	while(k--)
	{
		string t=s;
		reverse(t.begin(),t.end());
		t=s+t;
		string s2=s;
		if(k==0)
		{
			for(int i=1;i<=s.length();i++)
				s2=min(s2,t.substr(i,s.length()));
			cout<<s2;
			return 0;
		}
		reverse(t.begin(),t.end());
		reverse(s2.begin(),s2.end());
		for(int i=0;i<=s.length();i++)
			s2=min(s2,t.substr(i,s.length()));
		reverse(s2.begin(),s2.end());
	//	cout<<t<<" "<<s2<<endl;
	//	system("pause");
		bool same=1;
		for(int i=1;i<s.length();i++)
			if(s[i]!=s[i-1])same=0;
		if(same)
		{
			cout<<s2;
			return 0;
		}
		s=s2;
	}
	return 0;
}