제출 #1207199

#제출 시각아이디문제언어결과실행 시간메모리
1207199repsakDNA 돌연변이 (IOI21_dna)C++20
0 / 100
170 ms25616 KiB
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;


vector<map<pair<char, char>, int>> values;

void init(std::string a, std::string b) {
	int N = a.size();
	values.resize(N + 1);
	
	for(int i = 0; i < N; i++){
		char A = a[i]; char B = b[i];

		values[i + 1] = values[i];
		values[i + 1][{A, B}]++;
	}
}

int get_distance(int x, int y) {
	// Create difference
	map<pair<char, char>, int> last = values[y + 1];
	map<pair<char, char>, int> first = values[x]; // might need -2?
	map<pair<char, char>, int> difference;

	vector<char> conv = {'A', 'C', 'T'};
	
	for(char c : conv){
		for(auto v : conv){
			difference[{c, v}] = last[{c, v}] - first[{c, v}];
			if(difference[{c, v}] < 0) return -1;
		}
	}
	int amount = 0;
	int additional = 0;
	for(char c : conv){
		for(auto v : conv){
			int in = min(difference[{c, v}], difference[{v, c}]);
			difference[{c, v}] -= in; difference[{v, c}] -= in;
			amount += in;

			int remain = max(difference[{c, v}], difference[{v, c}]);
			
			if(remain){
				int f = difference[{c, v}];
				int b = difference[{v, c}];
				additional += remain;
			}
			difference[{c, v}] = 0; difference[{v, c}] = 0;
		}
	}
	if(additional % 3 != 0) return -1; //is this true?

	return amount + (additional / 3) * 2;
}

// #include "grader.cpp"
#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...