제출 #1349294

#제출 시각아이디문제언어결과실행 시간메모리
1349294mydknDNA 돌연변이 (IOI21_dna)C++17
100 / 100
27 ms8440 KiB
#include "dna.h"
#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5 + 5;

int re[maxn][3][3];
int n;
map<char, int> mp = {{'A', 0}, {'C', 1}, {'T', 2}}; int ca[maxn][3], cb[maxn][3];

void init(string a, string b){
	n = a.length();
	for(int i=1;i<=n;++i){
		for(int j=0;j<3;++j){
			for(int k=0;k<3;++k){
				re[i][j][k] += re[i-1][j][k];
			}
			ca[i][j] += ca[i-1][j];
			cb[i][j] += cb[i-1][j];
		}
		int ma = mp[a[i-1]], mb = mp[b[i-1]];
		++ca[i][ma];
		++cb[i][mb];
		++re[i][ma][mb];
	}
}

int get_distance(int x, int y){
	int *par = ca[y+1], *pal = ca[x], *pbr = cb[y+1], *pbl = cb[x];
	for(int i=0;i<3;++i){
		if(par[i] - pal[i] != pbr[i] - pbl[i]) return -1;
	}
	int curr[3][3];
	for(int i=0;i<3;++i){
		for(int j=0;j<3;++j){
			curr[i][j] = re[y+1][i][j] - re[x][i][j];
		}
	}
	int cnt = 0;
	for(int i=0;i<3;++i){
		for(int j=0;j<3;++j){
			if(i == j) continue;
			int mn = min(curr[i][j], curr[j][i]);
			cnt += mn;
			curr[i][j] -= mn;
			curr[j][i] -= mn;
		}
	}
	cnt += curr[0][1]*2 + curr[1][0]*2;
	return cnt;
}
#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...