結果

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

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 7520KB
2 AC 100% 2ms 8000KB
3 AC 100% 2ms 8336KB
4 AC 100% 2ms 7712KB
5 AC 100% 2ms 7712KB
6 AC 100% 2ms 8320KB
7 AC 100% 2ms 7984KB
8 AC 100% 2ms 8336KB
9 AC 100% 2ms 8320KB
10 AC 100% 2ms 8336KB
11 AC 100% 46ms 9360KB
12 AC 100% 23ms 9440KB
13 AC 100% 19ms 8160KB
14 AC 100% 29ms 9008KB
15 AC 100% 15ms 9200KB
16 AC 100% 27ms 9360KB
17 AC 100% 21ms 9392KB
18 AC 100% 45ms 9344KB
19 AC 100% 21ms 9456KB
20 AC 100% 27ms 9408KB

ソースコード

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