ソースコード
#include "iostream"
#include "string"
using namespace std;
long long int N, M, K, Q, W, H, L, R;
long long int ans;
int main() {
cin >> N >> L >> R;
string s[1001];
long long int l[1001] = {};
long long int r[1001] = {};
long long int sum[1001][26] = {};
long long int loop_size[1001] = {};
long long int loop_sum[1001][26] = {};
long long int ret[26] = {};
for (int i = 1; i <= N; i++) {
cin >> s[i] >> M;
l[i] = r[i - 1] + 1;
r[i] = l[i] + s[i].size() - 1;
loop_size[i] = r[i];
r[i] *= (1 + M);
int box = 0;
if (i)for (int j = 0; j < 26; j++)sum[i][j] = sum[i - 1][j];
for (auto j : s[i]) {
sum[i][j - 'a']++;
}
for (int j = 0; j < 26; j++) {
loop_sum[i][j] = sum[i][j];
sum[i][j] *= (1 + M);
}
}
while (R) {
if (loop_size[1] > R) {
for (int i = 0; i < R; i++) {
ret[s[1][i] - 'a']++;
}
R = 0;
}
for (int i = 1; i < N; i++) {
if (r[i] < R&&loop_size[i + 1]>R) {
for (int j = 0; j < 26; j++) {
ret[j] += sum[i][j];
}
R -= r[i];
for (int j = 0; j < R; j++) {
ret[s[i + 1][j] - 'a']++;
}
R = 0;
break;
}
}
for (int i = 1; i <= N; i++) {
if (loop_size[i] <= R&&R <= r[i]) {
for (int j = 0; j < 26; j++) {
ret[j] += loop_sum[i][j] * (R / loop_size[i]);
}
R -= (R / loop_size[i])*loop_size[i];
break;
}
}
}
L--;
while (L > 0) {
if (loop_size[1] > L) {
for (int i = 0; i < L; i++) {
ret[s[1][i] - 'a']--;
}
L = 0;
}
for (int i = 1; i < N; i++) {
if (r[i] < L&&loop_size[i + 1]>L) {
for (int j = 0; j < 26; j++) {
ret[j] -= sum[i][j];
}
L -= r[i];
for (int j = 0; j < L; j++) {
ret[s[i + 1][j] - 'a']--;
}
L = 0;
break;
}
}
for (int i = 1; i <= N; i++) {
if (loop_size[i] <= L&&L <= r[i]) {
for (int j = 0; j < 26; j++) {
ret[j] -= loop_sum[i][j] * (L / loop_size[i]);
}
L -= (L / loop_size[i])*loop_size[i];
break;
}
}
}
for (int i = 0; i < 26; i++) {
if (i)cout << " ";
cout << ret[i];
}
cout << endl;
return 0;
}