結果

提出番号 977
提出者 MMNMM
言語 C++
提出日時 2017-08-01 23:36:24
問題名 (43)文字列をやたらめったら繰り返す
結果 AC
点数 100%

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 1ms 7504KB
2 AC 100% 1ms 7408KB
3 AC 100% 1ms 7792KB
4 AC 100% 1ms 8304KB
5 AC 100% 1ms 7664KB
6 AC 100% 1ms 7504KB
7 AC 100% 2ms 8320KB
8 AC 100% 2ms 7984KB
9 AC 100% 1ms 7520KB
10 AC 100% 2ms 8000KB
11 AC 100% 3ms 10288KB
12 AC 100% 4ms 10288KB
13 AC 100% 4ms 7968KB
14 AC 100% 6ms 9568KB
15 AC 100% 5ms 10048KB
16 AC 100% 4ms 10304KB
17 AC 100% 4ms 10304KB
18 AC 100% 3ms 10304KB
19 AC 100% 6ms 10288KB
20 AC 100% 4ms 10128KB

ソースコード

#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;
}