제출 #438685

#제출 시각아이디문제언어결과실행 시간메모리
438685ivan_tudorDNA 돌연변이 (IOI21_dna)C++17
100 / 100
65 ms6096 KiB
#include "dna.h"
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int comb[N][3][3];
int getcode(char c){
	if(c == 'A')
		return 0;
	if(c == 'C')
		return 1;
	return 2;
}
void init(std::string a, std::string b) {
	int n = a.size();
	for(int i = 0; i <n; i++){
		comb[i][getcode(a[i])][getcode(b[i])] = 1;
		if(i != 0){
			for(int j = 0; j < 3; j++){
				for(int k = 0; k < 3; k++)
					comb[i][j][k] += comb[i-1][j][k];
			}
		}
	}
}

int get_distance(int x, int y) {
	int ans[3][3];
	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 3; j++){
			ans[i][j] = comb[y][i][j];
		}
	}
	x--;
	if(x>=0){
		for(int i = 0; i < 3; i++){
			for(int j = 0; j < 3; j++){
				ans[i][j] -= comb[x][i][j];
			}
		}
	}
	int alet[3] = {0, 0, 0};
	int blet[3] = {0, 0, 0};
	for(int i = 0; i <3; i++){
		for(int j = 0; j < 3; j++){
			alet[i] += ans[i][j];
			blet[j] += ans[i][j];
		}
	}
	for(int i = 0; i < 3; i++)
		if(alet[i] != blet[i])
			return -1;
	int rsp = 0;
	for(int i = 0; i < 3; i++){
		for(int j = i +1; j < 3; j++){
			int x = min(ans[i][j], ans[j][i]);
			rsp += x;
			ans[i][j] -= x;
			ans[j][i] -= x;
		}
	}
	int val = 0;
	for(int i = 0; i < 3; i++){
		for(int j = 0; j < 3; j++){
			if(i != j){
				if(ans[i][j] != 0)
					val = ans[i][j];
			}
		}
	}
	rsp += 2 * val;
	return rsp;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...