제출 #1368659

#제출 시각아이디문제언어결과실행 시간메모리
1368659madamadam3DNA 돌연변이 (IOI21_dna)C++20
100 / 100
22 ms8944 KiB
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100'000;

int apref[MAXN+1][3], bpref[MAXN+1][3], m[MAXN+1][3][3];
void init(string a, string b) {
	vector<int> as, bs;
	for (auto c : a) {
		if (c == 'A') as.push_back(0);
		else if (c == 'T') as.push_back(1);
		else as.push_back(2);
	}
	for (auto c : b) {
		if (c == 'A') bs.push_back(0);
		else if (c == 'T') bs.push_back(1);
		else bs.push_back(2);
	}

	for (int i = 1; i <= a.size(); i++) {
		for (int j = 0; j < 3; j++) apref[i][j] = apref[i-1][j];
		apref[i][as[i-1]]++;

		for (int j = 0; j < 3; j++) bpref[i][j] = bpref[i-1][j];
		bpref[i][bs[i-1]]++;

		for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) m[i][j][k] += m[i-1][j][k];
		m[i][as[i-1]][bs[i-1]]++;
	}
}

int get_distance(int x, int y) {
	for (int i = 0; i < 3; i++) if ((apref[y+1][i] - apref[x][i]) != (bpref[y+1][i] - bpref[x][i])) return -1;

	int ans = 0, g[3][3] = {};
	for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) g[j][k] = m[y+1][j][k] - m[x][j][k];

	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			if (i == j) continue;
			int &u = g[i][j], &v = g[j][i];
			int w = min(u, v);

			u -= w; v -= w; ans += w;
		}
	}

	ans += 2*(g[0][1] + g[0][2]);
	return ans;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…