OI XXXI - cza

// https://szkopul.edu.pl/problemset/problem/R-s87nyFFh8WR12UGiJz_5Ii/site/?key=statement

#include <bits/stdc++.h>

using namespace std;

#define int long long

constexpr int sizik = 1000 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef vec<vec<int>> _kra;

constexpr int K = 2;

typedef ar<int, K> H;

int mod = 1000 * 1000 * 1000 + 7;

// #define GARY_DBG

int _pow(int a, int b) {
    if (b == 0) return 1;
    if (b % 2 == 0) {
        int c = _pow(a, b / 2);
        return (c * c) % mod;
    } else {
        return (a * _pow(a, b - 1)) % mod;
    }
}

int p[K] = {199, 211}, pw[K];
int pot[sizik][K];

H calc_hash(const std::string& s) {
    int nk = (int)s.size();
    H local_hash{};
    for (int i = 0; i < K; i++) {
        for (int j = 0; j < nk; j++) {
            local_hash[i] = (local_hash[i] + s[j] * pot[j + 1][i]) % mod;
        }
    }
    return local_hash;
}

void replace_new_first(H& a, int k, char c, char c1) {
    for (int i = 0; i < K; i++) {
        a[i] = (a[i] + pot[k + 1][i] * c) % mod;
        a[i] = (((a[i] * pw[i] - c1) % mod) + mod) % mod;
    }
}

std::map<H, std::map<int, int>> q;
std::map<H, H> q1;
std::map<H, int> d;
std::map<H, std::string> mmp1;
std::map<H, char> mmp2, mmp3;

std::pair<int, char> kra[2 * sizik];
std::string ansix;
void get_ans(int start_v, int xx) {
    for (; xx > 0; xx--) {
        ansix += kra[start_v].second;
        start_v = kra[start_v].first;
    }
}

// może zwykly vector?

void print_H(const H& a) {
    std::cout << a[0] << " " << a[1];
}

void solve() {
    int n, k, a_ans, b_ans;
    std::cin >> n >> k >> a_ans >> b_ans;

    std::string s, s1;
    std::cin >> s;

    for (int i = 0; i < k; i++) {
        s1 += s[i];
    }

    H h1 = calc_hash(s1);

    q[h1][s[k]]++;

    for (int i = 0; i <= k + 1; i++) {
        s += 'a';
    }

    int nk = s.size();

    for (int i = k; i < nk; i++) {
        replace_new_first(h1, k, s[i], s[i - k]);

        mmp2[h1] = s[i - k + 1];
        mmp3[h1] = s[i];

        if ((i + 1 < n)) {
            q[h1][s[i + 1]]++;
        } else {
            q[h1][0] += 0;
        }
    }

    for (const auto& [a, b] : q) {
        int maxi = 0;
        char maxi_char = 'a';
        for (const auto& [c, cnt] : b) {
            if (cnt > maxi) {
                maxi = cnt;
                maxi_char = c;
            }
        }

        H a1 = a;
        replace_new_first(a1, k, maxi_char, mmp2[a]);

        q1[a] = a1;
    }

    H curr_v = calc_hash(s.substr(n - k, k));

    H empty_h{};

    int pth = 0, cle = 0, ppv = 0;
    while (true) {
        ++ppv;

        if (d[curr_v] != 0) {
            cle = ppv - d[curr_v];
            pth = d[curr_v] - 1;

            kra[ppv - 1] = std::make_pair(d[curr_v], mmp3[curr_v]);

            break;
        }

        d[curr_v] = ppv;
        if (d[curr_v] > 1) kra[d[curr_v] - 1] = std::make_pair(d[curr_v], mmp3[curr_v]);

        if (q1[curr_v] == empty_h) {
        } else {
            curr_v = q1[curr_v];
        }
    }

    int z = a_ans - n;

    int xxx = b_ans - a_ans + 1;
    if (z <= pth) {
        get_ans(z, xxx);
    } else {
        get_ans(pth + 1 + ((z - pth - 1) % cle), xxx);
    }

    std::cout << ansix << '\n';
}

int32_t main() {
    std::ios_base::sync_with_stdio(0);
    std::cin.tie(0);
    std::cout.tie(0);

    for (int j = 0; j < K; j++) {
        pot[0][j] = 1;
        for (int i = 1; i < sizik; i++) {
            pot[i][j] = (p[j] * pot[i - 1][j]) % mod;
        }

        pw[j] = _pow(p[j], mod - 2);
    }

    int t = 1;
    // std::cin >> t;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}