제출 #1176524

#제출 시각아이디문제언어결과실행 시간메모리
1176524slivajanDNA 돌연변이 (IOI21_dna)C++20
100 / 100
35 ms7108 KiB
#include "dna.h"

#include "bits/stdc++.h"
using namespace std;

using un = int;
using vuc = vector<un>;
using vol = vector<bool>;

#define REP(i, a, b) for (un i = (un)a; i < (un)b; i++)
#define FEAC(i, a) for (auto&& i : a)
#define vec vector
#define ALL(x) (x).begin(), (x).end()

constexpr char A = 'A';
constexpr char B = 'T';
constexpr char C = 'C';


constexpr un AB = 0;
constexpr un BA = 1;
constexpr un BC = 2;
constexpr un CB = 3;
constexpr un AC = 4;
constexpr un CA = 5;



vec<vuc> prefixes;
un N;


void init(std::string X, std::string Y) {
	N = X.size();

	vec<vuc> events(6, vuc(N, 0));

	REP(i, 0, N){
		if ((X[i] == A) and (Y[i] == B)){
			events[AB][i] = 1;
		}
		if ((X[i] == B) and (Y[i] == A)){
			events[BA][i] = 1;
		}
		if ((X[i] == A) and (Y[i] == C)){
			events[AC][i] = 1;
		}
		if ((X[i] == C) and (Y[i] == A)){
			events[CA][i] = 1;
		}
		if ((X[i] == B) and (Y[i] == C)){
			events[BC][i] = 1;
		}
		if ((X[i] == C) and (Y[i] == B)){
			events[CB][i] = 1;
		}
	}


	prefixes = vec<vuc>(6, vuc(N+1, 0));

	REP(s, 0, 6) {
		REP(i, 1, N+1){
			prefixes[s][i] = prefixes[s][i-1] + events[s][i-1];
		}
	}

}

int get_distance(int x, int y) {
	vuc rets(6, 0);

	REP(s, 0, 6){
		rets[s] = prefixes[s][y+1] - prefixes[s][x];
	}

	if ((rets[AB] + rets[AC]) != (rets[BA] + rets[CA])) return -1;
	if ((rets[BA] + rets[BC]) != (rets[AB] + rets[CB])) return -1;
	if ((rets[CA] + rets[CB]) != (rets[AC] + rets[BC])) return -1;


	un ret = 0;
	un m;


	m = min(rets[AB], rets[BA]);
	ret += m;
	rets[AB] -= m;
	rets[BA] -= m;

	m = min(rets[BC], rets[CB]);
	ret += m;
	rets[BC] -= m;
	rets[CB] -= m;

	m = min(rets[AC], rets[CA]);
	ret += m;
	rets[AC] -= m;
	rets[CA] -= m;


	ret += 2*max(rets[AB], rets[BA]);

	return ret;
}
#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...