제출 #1355197

#제출 시각아이디문제언어결과실행 시간메모리
1355197Charizard2021DNA 돌연변이 (IOI21_dna)C++20
100 / 100
21 ms7608 KiB
#include "dna.h"
#include<bits/stdc++.h>
using namespace std;
int n;
string A;
string B;
vector<int> prefDA;
vector<int> prefDC;
vector<int> prefDT;
vector<int> prefBA;
vector<int> prefBC;
vector<int> prefBT;
vector<int> prefAC;
vector<int> prefCA;
vector<int> prefAT;
vector<int> prefTA;
vector<int> prefCT;
vector<int> prefTC;
void init(string a, string b){
	n = (int)a.size();
	A = a;
	B = b;
	prefDA.resize(n);
	prefDC.resize(n);
	prefDT.resize(n);
	prefBA.resize(n);
	prefBC.resize(n);
	prefBT.resize(n);
	prefAC.resize(n);
	prefCA.resize(n);
	prefAT.resize(n);
	prefTA.resize(n);
	prefCT.resize(n);
	prefTC.resize(n);
	for(int i = 0; i < n; i++){
		if(i != 0){
			prefDA[i] = prefDA[i - 1];
			prefDC[i] = prefDC[i - 1];
			prefDT[i] = prefDT[i - 1];
			prefBA[i] = prefBA[i - 1];
			prefBC[i] = prefBC[i - 1];
			prefBT[i] = prefBT[i - 1];
			prefAC[i] = prefAC[i - 1];
			prefCA[i] = prefCA[i - 1];
			prefAT[i] = prefAT[i - 1];
			prefTA[i] = prefTA[i - 1];
			prefCT[i] = prefCT[i - 1];
			prefTC[i] = prefTC[i - 1];
		}
		if(A[i] == 'A'){
			prefDA[i]++;
		}
		if(A[i] == 'C'){
			prefDC[i]++;
		}
		if(A[i] == 'T'){
			prefDT[i]++;
		}
		if(B[i] == 'A'){
			prefBA[i]++;
		}
		if(B[i] == 'C'){
			prefBC[i]++;
		}
		if(B[i] == 'T'){
			prefBT[i]++;
		}
		if(A[i] == 'A' && B[i] == 'C'){
			prefAC[i]++;
		}
		if(A[i] == 'C' && B[i] == 'A'){
			prefCA[i]++;
		}
		if(A[i] == 'A' && B[i] == 'T'){
			prefAT[i]++;
		}
		if(A[i] == 'T' && B[i] == 'A'){
			prefTA[i]++;
		}
		if(A[i] == 'C' && B[i] == 'T'){
			prefCT[i]++;
		}
		if(A[i] == 'T' && B[i] == 'C'){
			prefTC[i]++;
		}
	}
}
int get_distance(int x, int y){
	if(prefDA[y] - (x == 0 ? 0 : prefDA[x - 1]) == prefBA[y] - (x == 0 ? 0 : prefBA[x - 1]) &&
	prefDC[y] - (x == 0 ? 0 : prefDC[x - 1]) == prefBC[y] - (x == 0 ? 0 : prefBC[x - 1]) &&
	prefDT[y] - (x == 0 ? 0 : prefDT[x - 1]) == prefBT[y] - (x == 0 ? 0 : prefBT[x - 1])){
		int valAC = prefAC[y] - (x == 0 ? 0 : prefAC[x - 1]);
		int valCA = prefCA[y] - (x == 0 ? 0 : prefCA[x - 1]);
		int valAT = prefAT[y] - (x == 0 ? 0 : prefAT[x - 1]);
		int valTA = prefTA[y] - (x == 0 ? 0 : prefTA[x - 1]);
		int valCT = prefCT[y] - (x == 0 ? 0 : prefCT[x - 1]);
		int valTC = prefTC[y] - (x == 0 ? 0 : prefTC[x - 1]);
		int val1 = min(valAC, valCA);
		int val2 = min(valAT, valTA);
		int val3 = min(valTC, valCT);
		valAC -= val1;
		valCA -= val1;
		valAT -= val2;
		valTA -= val2;
		valTC -= val3;
		valCT -= val3;
		int sum = valAC + valCA + valAT + valTA + valTC + valCT;
		sum /= 3;
		sum *= 2;
		return sum + val1 + val2 + val3;
	}
	else{
		return -1;
	}
}
#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...