답안 #437067

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
437067 2021-06-25T18:11:52 Z DunderMifflin DNA 돌연변이 (IOI21_dna) C++17
100 / 100
74 ms 8476 KB
#include "dna.h"
#include<map>
using namespace std;

const int N = 123456;

int pref[3][3][N];
int asum[3][N];
int bsum[3][N];
map<char, int> f;

void init(std::string a, std::string b) {
	f['A'] = 0; f['C'] = 1; f['T'] = 2;
	int n = (int) a.size();
	for (int i = 0; i < n; i++) {
		for (int k = 0; k < 3; k++) {
			asum[k][i] = 0;
			bsum[k][i] = 0;
			for (int l = 0; l < 3; l++) {
				pref[k][l][i] = 0;
			}
		}
	}
	for (int i = 0; i < n; i++) {
		if (i > 0) {
			for (int k = 0; k < 3; k++) {
				for (int l = 0; l < 3; l++) {
					pref[k][l][i] = pref[k][l][i - 1];
				}
				asum[k][i] = asum[k][i - 1];
				bsum[k][i] = bsum[k][i - 1];
			}
		}
		for (int k = 0; k < 3; k++) {
			for (int l = 0; l < 3; l++) {
				pref[k][l][i] += (f[a[i]] == k && f[b[i]] == l);
			}
			asum[k][i] += (f[a[i]] == k);
			bsum[k][i] += (f[b[i]] == k);
		}
	}
}

int get_distance(int x, int y) {
	for (int t = 0; t < 3; t++) {
		int res_a = asum[t][y];
		if (x > 0) {
			res_a -= asum[t][x - 1];
		}
		int res_b = bsum[t][y];
		if (x > 0) {
			res_b -= bsum[t][x - 1];
		}
		if (res_a != res_b) return -1;
	}
	int ans = 0;
	int surplus = 0;
	for (int k = 0; k < 3; k++) {
		for (int l = k + 1; l < 3; l++) {
			int k_to_l = pref[k][l][y];
			if (x > 0) {
				k_to_l -= pref[k][l][x - 1];
			}

			int l_to_k = pref[l][k][y];
			if (x > 0) {
				l_to_k -= pref[l][k][x - 1];
			}

			ans += min(k_to_l, l_to_k);
			surplus += max(k_to_l, l_to_k) - min(k_to_l, l_to_k);
		}
	}
	return ans + ((2 * surplus) / 3);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 7940 KB Output is correct
2 Correct 62 ms 8004 KB Output is correct
3 Correct 69 ms 7520 KB Output is correct
4 Correct 63 ms 8064 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 1 ms 332 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 15 ms 6604 KB Output is correct
5 Correct 16 ms 6804 KB Output is correct
6 Correct 16 ms 6760 KB Output is correct
7 Correct 14 ms 6360 KB Output is correct
8 Correct 21 ms 6808 KB Output is correct
9 Correct 13 ms 6808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 15 ms 6604 KB Output is correct
5 Correct 16 ms 6804 KB Output is correct
6 Correct 16 ms 6760 KB Output is correct
7 Correct 14 ms 6360 KB Output is correct
8 Correct 21 ms 6808 KB Output is correct
9 Correct 13 ms 6808 KB Output is correct
10 Correct 55 ms 7964 KB Output is correct
11 Correct 61 ms 8044 KB Output is correct
12 Correct 74 ms 7900 KB Output is correct
13 Correct 58 ms 8168 KB Output is correct
14 Correct 61 ms 8344 KB Output is correct
15 Correct 57 ms 8308 KB Output is correct
16 Correct 61 ms 8020 KB Output is correct
17 Correct 52 ms 8172 KB Output is correct
18 Correct 54 ms 8452 KB Output is correct
19 Correct 70 ms 8032 KB Output is correct
20 Correct 50 ms 8176 KB Output is correct
21 Correct 50 ms 8396 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 332 KB Output is correct
2 Correct 1 ms 332 KB Output is correct
3 Correct 1 ms 332 KB Output is correct
4 Correct 15 ms 6604 KB Output is correct
5 Correct 16 ms 6804 KB Output is correct
6 Correct 16 ms 6760 KB Output is correct
7 Correct 14 ms 6360 KB Output is correct
8 Correct 21 ms 6808 KB Output is correct
9 Correct 13 ms 6808 KB Output is correct
10 Correct 15 ms 6220 KB Output is correct
11 Correct 17 ms 6804 KB Output is correct
12 Correct 16 ms 6380 KB Output is correct
13 Correct 17 ms 6764 KB Output is correct
14 Correct 17 ms 6732 KB Output is correct
15 Correct 16 ms 6808 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 56 ms 7940 KB Output is correct
2 Correct 62 ms 8004 KB Output is correct
3 Correct 69 ms 7520 KB Output is correct
4 Correct 63 ms 8064 KB Output is correct
5 Correct 1 ms 332 KB Output is correct
6 Correct 1 ms 332 KB Output is correct
7 Correct 1 ms 332 KB Output is correct
8 Correct 1 ms 332 KB Output is correct
9 Correct 1 ms 332 KB Output is correct
10 Correct 1 ms 332 KB Output is correct
11 Correct 15 ms 6604 KB Output is correct
12 Correct 16 ms 6804 KB Output is correct
13 Correct 16 ms 6760 KB Output is correct
14 Correct 14 ms 6360 KB Output is correct
15 Correct 21 ms 6808 KB Output is correct
16 Correct 13 ms 6808 KB Output is correct
17 Correct 55 ms 7964 KB Output is correct
18 Correct 61 ms 8044 KB Output is correct
19 Correct 74 ms 7900 KB Output is correct
20 Correct 58 ms 8168 KB Output is correct
21 Correct 61 ms 8344 KB Output is correct
22 Correct 57 ms 8308 KB Output is correct
23 Correct 61 ms 8020 KB Output is correct
24 Correct 52 ms 8172 KB Output is correct
25 Correct 54 ms 8452 KB Output is correct
26 Correct 70 ms 8032 KB Output is correct
27 Correct 50 ms 8176 KB Output is correct
28 Correct 50 ms 8396 KB Output is correct
29 Correct 15 ms 6220 KB Output is correct
30 Correct 17 ms 6804 KB Output is correct
31 Correct 16 ms 6380 KB Output is correct
32 Correct 17 ms 6764 KB Output is correct
33 Correct 17 ms 6732 KB Output is correct
34 Correct 16 ms 6808 KB Output is correct
35 Correct 1 ms 332 KB Output is correct
36 Correct 60 ms 7600 KB Output is correct
37 Correct 59 ms 8056 KB Output is correct
38 Correct 58 ms 8040 KB Output is correct
39 Correct 59 ms 8412 KB Output is correct
40 Correct 59 ms 8424 KB Output is correct
41 Correct 14 ms 6732 KB Output is correct
42 Correct 63 ms 8048 KB Output is correct
43 Correct 74 ms 8448 KB Output is correct
44 Correct 55 ms 8476 KB Output is correct
45 Correct 48 ms 8040 KB Output is correct
46 Correct 65 ms 8448 KB Output is correct
47 Correct 50 ms 8440 KB Output is correct