#include using namespace std; const int N = 2000001; int dp[N]; pair, int> pr[N]; const int offset = 1 << 19; bool tr[offset << 1]; void insert(int v, int a, int b, int ia, int ib) { if(a >= ib || b <= ia) return; if(a >= ia && b <= ib) tr[v] = true; if(!tr[v]) { insert(v * 2, a, (a + b) / 2, ia, ib); insert(v * 2 + 1, (a + b) / 2, b, ia, ib); tr[v] = tr[v * 2] && tr[v * 2 + 1]; } } void insert(int a, int b) { insert(1, 0, offset, a, b); } int main() { ios_base::sync_with_stdio(false); int n, k; cin >> n >> k; insert(n, offset); string str; cin >> str; str += str.substr(0, k); int m = str.size(); for(int i = 0; i < m; i++) dp[i] = str[i]; for(int i = 1; i <= k; i *= 2) { for(int j = 0; j < m; j++) pr[j] = { { dp[j], dp[j+i] }, j }; sort(pr, pr + m); int l = 0; for(int j = 0; j < m; j++) { if(j > 0 && pr[j].first != pr[j-1].first) l++; dp[pr[j].second] = l; } } for(int i = 0; i < m; i++) { int j = pr[i].second; if(j >= n) continue; if(j + k <= n) insert(j, j + k); else { insert(j, n); insert(0, j + k - n); } if(tr[1]) { cout << str.substr(j, k) << endl; return 0; } } }