#include <cstdio>
int N, kmp[200001], G = 1;
char s[200002];
long long L, R, len[666], ans[666][26], O[26];
void Calc(long long x, int f)
{
for (int i = G; i; i--)
if (len[i] <= x)
{
x -= len[i];
for (int j = 0; j < 26; j++)
O[j] += f * ans[i][j];
}
for (int i = 1; i <= x; i++)
O[s[i] - 'a'] += f;
}
int main()
{
scanf("%s", s + 1);
while (s[N + 1])
N++;
scanf("%lld%lld", &L, &R);
for (int i = 2; i <= N; i++)
{
int ans = kmp[i - 1];
while (ans && s[ans + 1] != s[i])
ans = kmp[ans];
if (s[ans + 1] == s[i])
kmp[i] = ans + 1;
else
kmp[i] = 0;
}
int E = N;
while (E + E >= N)
E = kmp[E];
N -= E;
if (kmp[N] << 1 >= N || kmp[N] == 0)
{
int T = N - kmp[N];
for (int i = 1; i <= T; i++)
O[s[i] - 'a'] += (R + T - i) / T - (L - 1 + T - i) / T;
for (int i = 0; i < 26; i++)
printf("%lld%c", O[i], " \n"[i == 25]);
return 0;
}
len[0] = N - kmp[N];
len[1] = N;
for (int i = 1; i <= N - kmp[N]; i++)
ans[0][s[i] - 'a']++;
for (int i = 1; i <= N; i++)
ans[1][s[i] - 'a']++;
while (len[G - 1] + len[G] <= R)
{
len[G + 1] = len[G - 1] + len[G];
for (int i = 0; i < 26; i++)
ans[G + 1][i] = ans[G - 1][i] + ans[G][i];
G++;
}
Calc(R, 1);
Calc(L - 1, -1);
for (int i = 0; i < 26; i++)
printf("%lld%c", O[i], " \n"[i == 25]);
return 0;
}
./Main.cpp: In function ‘int main()’:
./Main.cpp:19:20: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%s", s + 1);
^
./Main.cpp:22:27: warning: ignoring return value of ‘int scanf(const char*, ...)’, declared with attribute warn_unused_result [-Wunused-result]
scanf("%lld%lld", &L, &R);
^