ソースコード
#include <bits/stdc++.h>
using namespace std;
long long int N, L, R, l, r, v[1145], p, al[1145][26], ll[1145], LL[1145], A[26], B[26], i;
char s[1145][1145];
void cnt(long long a[26], long long b){
long long bb = (upper_bound(ll, ll + N, b) - ll) - 1;
if(b <= LL[bb]){
for(int i = 0; i < b - ll[bb]; ++i){
++a[s[bb][i] - 97];
}
if(ll[bb])for(int i = 0; i < 26; ++i)a[i] += al[bb][i] * (v[bb - 1] + 1);
return;
}
for(int i = 0; i < 26; ++i){
a[i] += al[bb + 1][i] * (b / LL[bb]);
}
cnt(a, b % LL[bb]);
}
int main(){
scanf("%lld%lld%lld", &N, &L, &R);
--L;
for(int i = 0; i < N; ll[++i] = LL[i - 1] * (v[i - 1] + 1)){
LL[i] = ll[i];
scanf("%s%lld", s[i], v + i);
for(char j : s[i]){
if(!j)break;
++LL[i];
++al[i + 1][j - 97];
}
for(int j = 0; j < 26; ++j){
al[i + 1][j] += al[i][j] * (v[i - 1] + 1);
}
}
for(int j = 0; j < 26; ++j){
al[N + 1][j] += al[N][j] * (v[N - 1] + 1);
}
cnt(A, R);
cnt(B, L);
for(int i = 0; i < 26; ++i){
cout << A[i] - B[i] << (i == 25?"\n":" ");
}
return 0;
}