Problem:
Score : 1100 points

Problem Statement

We will call a string that can be obtained by concatenating two equal strings an even string.
For example, xyzxyz and aaaaaa are even, while ababab and xyzxy are not.

For a non-empty string S, we will define f(S) as the shortest even string that can be obtained by appending one or more characters to the end of S.
For example, f(abaaba)=abaababaab.
It can be shown that f(S) is uniquely determined for a non-empty string S.

You are given an even string S consisting of lowercase English letters.
For each letter in the lowercase English alphabet, find the number of its occurrences from the l-th character through the r-th character of f^{10^{100}} (S).

Here, f^{10^{100}} (S) is the string f(f(f( ... f(S) ... ))) obtained by applying f to S 10^{100} times.

Constraints

2 \leq |S| \leq 2\times 10^5

1 \leq l \leq r \leq 10^{18}

S is an even string consisting of lowercase English letters.

l and r are integers.

Input

Input is given from Standard Input in the following format:

S
l r

Output

Print 26 integers in a line with spaces in between.
The i-th integer should be the number of the occurrences of the i-th letter in the lowercase English alphabet from the l-th character through the r-th character of f^{10^{100}} (S).

Sample Input 1

abaaba
6 10

Sample Output 1

3 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0

Since f(abaaba)=abaababaab, the first ten characters in f^{10^{100}}(S) is also abaababaab. Thus, the sixth through the tenth characters are abaab. In this string, a appears three times, b appears twice and no other letters appear, and thus the output should be 3 and 2 followed by twenty-four 0s.

Sample Input 2

xx
1 1000000000000000000

Sample Output 2

0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1000000000000000000 0 0

Sample Input 3

vgxgpuamkvgxgvgxgpuamkvgxg
1 1000000000000000000

Sample Output 3

87167725689669676 0 0 0 0 0 282080685775825810 0 0 0 87167725689669676 0 87167725689669676 0 0 87167725689669676 0 0 0 0 87167725689669676 141040342887912905 0 141040342887912905 0 0

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include<iostream>
#include<cstring>
using namespace std;
long long z[888888],sz,pos,g,cnt[28][222222],p[28][444444],q[28][888888];
long long l,r,sp,sq,len[111],re,num[111],cur,res;
char s[888888];
void z_func(int sz)
{
	long long l,r,j,k;
	l=0;r=0;
	for (int i=1;i<sz;i++)
	{
		if (i>r)
		{
			for (j=0;j<sz-i;j++)
			{
				if (s[j]!=s[j+i]) break;
			}
			l=i;r=i+j-1;z[i]=j;
		}
		else
		{
			k=i-l;
			if (z[k]<r-i+1) 
			{
				z[i]=z[k];
			}
			else 
			{
				for (j=r;j<sz;j++)
				{
					if (s[j]!=s[j-i]) break;
				}
				l=i;r=j-1;z[i]=r-l+1;
			}
		}
	}
}
long long query(long long p,long long a)
{
	if (p%g==0) return cnt[a][g-1]*(p/g);
	return cnt[a][g-1]*(p/g)+cnt[a][(p-1)%g];
}
long long calc(long long pos,long long a)
{
	if (!pos) return 0;
	if (pos<=sq) return q[a][pos-1];
	len[1]=sp;len[2]=sq;num[1]=p[a][sp-1];num[2]=q[a][sq-1];re=pos-sq;res=num[2];
	for (int i=3;i<111;i++)
	{
		if (re<len[i-2])
		{
			cur=i-2;
			break;
		}
		len[i]=len[i-1]+len[i-2];
		num[i]=num[i-1]+num[i-2];
		res+=num[i-2];
		re-=len[i-2];
	}
	while(cur>2)
	{
		if (re>=len[cur-1])
		{
			res+=num[cur-1];
			re-=len[cur-1];
			cur-=2;
		}
		else cur--;
	}
	if (!re) return res;
	if (cur==2) return res+q[a][re-1];
	return res+p[a][re-1];
}
int main()
{
	scanf("%s",s);
	scanf("%lld%lld",&l,&r);
	sz=strlen(s);
	z_func(sz);
	for (int i=1;i<sz;i++)
	{
		if (z[i]+i==sz && sz%i==0)
		{
			z_func(i);g=i;
			for (int j=1;j<i;j++) 
			{
				if (z[j]+j==i) g=0;
			}
			break;
		}
	}
	if (g)
	{
		cnt[s[0]-'a'][0]=1;
		for (int i=1;i<g;i++) 
		{
			for (int j=0;j<26;j++)
			{
				if (j==s[i]-'a') cnt[j][i]=cnt[j][i-1]+1;
				else cnt[j][i]=cnt[j][i-1];
			}
		}
		for (int i=0;i<26;i++)
		{
			printf("%lld ",query(r,i)-query(l-1,i));
		}
		return 0;
	}
	for (int i=sz/2+1;i<sz;i++)
	{
		if (i+z[i]==sz)
		{
			pos=i;
			break;
		}
	}
	for (int i=sz-pos;i<pos;i++)
	{
		s[sz++]=s[i];
	}
	z_func(sz);
	p[s[0]-'a'][0]=sp=1;
	for (int i=1;i<sz;i++)
	{
		for (int j=0;j<26;j++)
		{
			p[j][i]=p[j][i-1];
		}
		p[s[i]-'a'][i]++;
		sp++;
	}
	pos=0;
	for (int i=sz/2+1;i<sz;i++)
	{
		if (i+z[i]==sz)
		{
			pos=i;
			break;
		}
	}
	for (int i=sz-pos;i<pos;i++)
	{
		s[sz++]=s[i];
	}
	q[s[0]-'a'][0]=sq=1;
	for (int i=1;i<sz;i++)
	{
		for (int j=0;j<26;j++)
		{
			q[j][i]=q[j][i-1];
		}
		q[s[i]-'a'][i]++;
		sq++;
	}
	for (int i=0;i<26;i++)
	{
		printf("%lld ",calc(r,i)-calc(l-1,i));
	}
	return 0;
}