#include using namespace std; typedef long long ll; typedef long double ld; #define rep(i, a, n) for (int i = (a); i < (n); i++) #define per(i, a, n) for (int i = (n) - 1; i >= (a); i--) typedef pair pli; struct SuffixArray { vector a; string s; SuffixArray(const string& _s) : s(_s + '\0') { int N = s.size(); vector b(N); a.resize(N); rep(i,0,N) { b[i].first = s[i]; b[i].second = i; } int q = 8; while ((1<= N) break; rep(i,0,N) { b[i].first = (ll)a[i] << q; if (i + (1 << moc) < N) b[i].first += a[i + (1 << moc)]; b[i].second = i; } } rep(i,0,a.size()) a[i] = b[i].second; } }; int n, k; bool isOk(const vector& sai, int lim, int want) { int n = sai.size(); vector allowed(n); rep(i,0,n) { allowed[i] = sai[i] <= lim; } //rep(i,0,n) cout << allowed[i]; //cout << endl; int fuel = 0; int dist = 0; rep(i,0,n) { //cout << i << " " << dist << " " << fuel << endl; dist++; fuel--; if (allowed[i]) { fuel = k-1; } if (fuel >= 0) { if (dist >= want) { //cout << "yes" << endl; return true; } } else { dist = 0; } } //cout << "no" << endl; return false; } int main(void) { ios_base::sync_with_stdio(false); cin >> n >> k; string s0; cin >> s0; string s = s0 + s0; SuffixArray sarr(s); //cout << s << endl; vector sai(sarr.a.size()); rep(i,0,sarr.a.size()) { sai[sarr.a[i]] = i; } //for(auto x : sarr.a) cout << x << endl; int fr = 0, to = 2*n; int best = -1; while (fr <= to) { //cout << fr << " " << to << endl; int mid = (fr + to) / 2; //cout << s << endl; if (isOk(sai, mid, n)) { best = mid; to = mid - 1; } else { fr = mid + 1; } } assert(best != -1); //cout << best << " " << sarr.a[best] << endl; cout << s.substr((sarr.a[best]) % n, k) << endl; }