//bool valid(Hasher &h, int k){
//    bool ok = true;
//    for(int i = 0; i < sz(h.s); i += k){
//        int l = i;
//        int r = i+k-1;
//        r = min(ll(r),sz(h.s)-1);
//        if(h.range_get(l,r) != h.range_get(0,r-l))
//            ok = false;
//    }
//    return ok;
//}
//string f(string s){
//    vpii ans;
//    Hasher h(s);
//    rep(sz,1,sz(s)){
//        if(valid(h,sz)){
//            int times = (sz(s)+sz-1)/sz;
//            if(times*sz == sz(s))
//                ++times;
//            if(times % 2)
//                ++times;
//            int tot_len = times*sz;
//            ans.pb({tot_len,sz});
//        }
//    }
//    unique(ans);
//    int sz = ans[0].Y;
//    while(sz(s) < ans[0].X){
//        s += s[sz(s)%sz];
//    }
//    return s;
//}
//struct String{
//    ll len;
//    map<char,ll> cnt;
//    String(string s){
//        s = s.substr(sz(s)/2);
//        len = sz(s);
//        for(char c : s)
//            cnt[c]++;
//    }
//    String operator+(const String &t)const{
//        String ans = *this;
//        ans.len += t.len;
//        for(auto _ : t.cnt)
//            ans.cnt[_.X] += _.Y;
//        return ans;
//    }
//    String operator-(const String &t)const{
//        String ans = *this;
//        ans.len += t.len;
//        for(auto _ : t.cnt)
//            ans.cnt[_.X] -= _.Y;
//        return ans;
//    }
//    friend ostream &operator<<(ostream &stream, String &t){
//        for(char c = 'a'; c <= 'z'; ++c){
//            stream << t.cnt[c];
//            if(c != 'z')
//                stream << ' ';
//        }
//        return stream;
//    }
//};
//String get(string s, ll n){
//    vector<String> arr;
//    arr.pb(String(s));
//    arr.pb(String(f(s)));
//    while(arr.back().len < n){
//        arr.pb(arr[sz(arr)-1]+arr[sz(arr)-2]);
//    }
//    String ans("");
//    for(int i = sz(arr)-1; i >= 1; --i){
//        while(n >= arr[i].len){
//            ans = ans+arr[i];
//            n -= arr[i].len;
//        }
//    }
//    rep(i,0,n-1)
//        ans.cnt[s[i]]++;
//    return ans;
//}
//void _(){
//    ll l,r;
//    string s;
//    cin >> s >> l >> r;
//
//    String ans = get(s,r)-get(s,l-1);
//    print(ans);
//
//}
//
#include <map>
#include <iomanip>
#include <algorithm>
#include <cassert>
#include <vector>
#include <utility>
#include <iostream>
#include <string>
#define pb push_back
#define REP_INT(i,l,r) for(int i = l; i <= r; ++i)
#define GET_REP_MACRO(_1,_2,_3,_4,NAME,...) NAME
#define rep(...) GET_REP_MACRO(__VA_ARGS__,REP_ANY,REP_INT)(__VA_ARGS__)
#define all(v) (v).begin(), (v).end()
#define sz(v) ll(v.size())
#define X first
#define Y second
#define T1 template<typename T> static
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef vector<ll> vl;
typedef pair<int, int> pii;
typedef vector<pii> vpii;
typedef long double ld;
const ll MOD = 1e9 + 7;
T1 ostream& operator<<(ostream& stream, const vector<T>& t);
T1 vector<T> unique(vector<T>& arr){
    sort(all(arr));
    arr.erase(unique(all(arr)), arr.end());
    return arr;
}
T1 istream& read(T, T, istream& = cin);
T1 void print(T x, string end = "\n"){
    cout << x << end;
}
ll mult64(ll x, ll y, ll mod){
    if(abs(x) >= mod)
        x %= mod;
    if(abs(y) >= mod)
        y %= mod;
    ll tmp = ((ull)x * y - (ull)((ld)x / mod * y + 1.0e-8) * mod);
    if(tmp >= mod)
        tmp -= mod;
    return (tmp < 0) ? (tmp + mod) : tmp;
}
struct Hasher{
    string s;
    const ll mod;
    vl psum;
    int n;
    ll ipow128(ll x, ll p){
        if(x >= mod)
            x %= mod;
        if(p == 0)
            return 1;
        if(p == 1)
            return x;
        return mult64(ipow128(mult64(x, x, mod), p / 2), ipow128(x, p % 2), mod);
    }
    ll _ext_euclid(ll a, ll b, ll c, ll d){
        if(c == 0)
            return b;
        return _ext_euclid(c, d, a % c, b - a / c * d);
    }
    ll inv128(ll x){
        return (_ext_euclid(mod, 0, x, 1) + mod) % mod;
    }
    vl k_pows;
    Hasher(string _s, ll _mod = MOD):s(_s), mod(_mod){
        n = sz(s);
        psum.resize(n + 1);
        ll mult = 1;
        ll k = 26;
        k_pows.resize(n+1,1);
        ll k_inv = inv128(k);
        for(int i = 1; i <= n; ++i){
            k_pows[i] = mult64(k_pows[i-1],k_inv,mod);
            psum[i] = mult64(mult,(s[i - 1] - 'a' + 1),mod);
            psum[i] += psum[i - 1];
            mult = mult64(mult,k,mod);
            mult %= mod;
            psum[i] %= mod;
        }
    }
    ll range_get(int l, int r){
        //ll ans = mult64(mod+psum[r+1]-psum[l],k_pows[l],mod);
        ll ans = (mod+psum[r+1]-psum[l])*k_pows[l]%mod;
        return ans;
    }
};
bool valid(Hasher &h, int k){
    bool ok = true;
    for(int i = 0; i < sz(h.s); i += k){
        int l = i;
        int r = i+k-1;
        r = min(ll(r),sz(h.s)-1);
        if(h.range_get(l,r) != h.range_get(0,r-l))
            ok = false;
    }
    return ok;
}
string f(string s){
    vpii ans;
    Hasher h(s);
    rep(sz,1,sz(s)){
        if(valid(h,sz)){
            int times = (sz(s)+sz-1)/sz;
            if(times*sz == sz(s))
                ++times;
            if(times % 2)
                ++times;
            int tot_len = times*sz;
            ans.pb({tot_len,sz});
        }
    }
    unique(ans);
    int sz = ans[0].Y;
    while(sz(s) < ans[0].X){
        s += s[sz(s)%sz];
    }
    return s;
}
struct String{
    ll len;
    map<char,ll> cnt;
    String(string s){
        s = s.substr(sz(s)/2);
        len = sz(s);
        for(char c : s)
            cnt[c]++;
    }
    String operator+(const String &t)const{
        String ans = *this;
        ans.len += t.len;
        for(auto _ : t.cnt)
            ans.cnt[_.X] += _.Y;
        return ans;
    }
    String operator-(const String &t)const{
        String ans = *this;
        ans.len += t.len;
        for(auto _ : t.cnt)
            ans.cnt[_.X] -= _.Y;
        return ans;
    }
    friend ostream &operator<<(ostream &stream, String &t){
        for(char c = 'a'; c <= 'z'; ++c){
            stream << t.cnt[c];
            if(c != 'z')
                stream << ' ';
        }
        return stream;
    }
};
String get(string s, ll n){
    vector<String> arr;
    arr.pb(String(s));
    arr.pb(String(f(s)));
    while(arr.back().len < n){
        arr.pb(arr[sz(arr)-1]+arr[sz(arr)-2]);
    }
    String ans("");
    for(int i = sz(arr)-1; i >= 1; --i){
        while(n >= arr[i].len){
            ans = ans+arr[i];
            n -= arr[i].len;
        }
    }
    rep(i,0,n-1)
        ans.cnt[s[i]]++;
    return ans;
}
void _(){
    ll l,r;
    string s;
    cin >> s >> l >> r;
    String ans = get(s,r)-get(s,l-1);
    print(ans);
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout << fixed << setprecision(15);
        _();
}


Measured memory_bytes: 4748