// #define _GLIBCXX_DEBUG // for STL debug (optional) #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll = long long int; using int64 = long long int; template void chmax(T &a, T b) {a = max(a, b);} template void chmin(T &a, T b) {a = min(a, b);} template void chadd(T &a, T b) {a = a + b;} int dx[] = {0, 0, 1, -1}; int dy[] = {1, -1, 0, 0}; const int INF = 1LL << 29; const ll LONGINF = 1LL << 60; const ll MOD = 1000000007LL; ll N, K; ll dp[300010]; int main() { cin >> N >> K; string T; cin >> T; fill(dp, dp + N + 1, 0); dp[N] = 1; for(int i=N-1; i>=0; i--) { for(int c=1; c<=2; c++) { if (i + c > N) continue; int num = stoi(T.substr(i, c)); if (num <= 0 || num > 26 || (int)to_string(num).size() != c) continue; dp[i] = min(K+1, dp[i] + dp[i+c]); } } int pos = 0; ll rem = K; while (pos < N) { // fprintf(stderr, "pos = %d, rem = %lld\n", pos, rem); assert(dp[pos] >= rem); for(int c=1; c<=2; c++) { if (pos + c > N) continue; int num = stoi(T.substr(pos, c)); if (num <= 0 || num > 26 || (int)to_string(num).size() != c) continue; if (rem > dp[pos + c]) { rem -= dp[pos + c]; } else { cout << (char)('a' + num - 1); pos += c; break; } } } assert(rem == 1); cout << endl; return 0; }