結果

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

テストケース

テストケース 結果 得点 実行時間 メモリ使用量
1 AC 100% 2ms 8256KB
2 AC 100% 4ms 7904KB
3 AC 100% 3ms 8336KB
4 AC 100% 2ms 7408KB
5 AC 100% 2ms 8320KB
6 AC 100% 3ms 7616KB
7 AC 100% 3ms 8240KB
8 AC 100% 4ms 8272KB
9 AC 100% 2ms 7968KB
10 AC 100% 2ms 8304KB
11 AC 100% 4ms 8784KB
12 AC 100% 3ms 8848KB
13 AC 100% 9ms 7984KB
14 AC 100% 9ms 8512KB
15 AC 100% 14ms 8656KB
16 AC 100% 4ms 8800KB
17 AC 100% 12ms 8816KB
18 AC 100% 3ms 8720KB
19 AC 100% 5ms 8832KB
20 AC 100% 4ms 8816KB

ソースコード

#include "iostream"
#include "climits"
#include "list"
#include "queue"
#include "stack"
#include "set"
#include "functional"
#include "algorithm"
#include "math.h"
#include "utility"
#include "string"
#include "map"
#include "unordered_map"
#include "iomanip"
#include "random"

using namespace std;
const long long int MOD = 1000000007;

long long int power(long long int x, long long int n, long long int M) {
	long long int tmp = 1;

	if (n > 0) {
		tmp = power(x, n / 2, M);
		if (n % 2 == 0) tmp = (tmp*tmp) % M;
		else tmp = (((tmp*tmp) % M)*x) % M;
	}
	return tmp;
}

long long int N, M, K, Q, W, H, L, R;
long long int ans;


int main() {
	ios::sync_with_stdio(false);
	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);
		}
		//cout << r[i] << endl;
	}
	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;
			}
		}
	}
	long long int aaa = 0;
	for (int i = 0; i < 26; i++) {
		if (i)cout << " ";
		cout << ret[i];
		aaa += ret[i];
	}
	cout << endl;
//	cout << aaa << endl;
	return 0;
}