# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
437870 | aggrovector | DNA 돌연변이 (IOI21_dna) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "dna.h"
#include <iostream>
#include <bits/stdc++.h>
int s[100005],ac[100005],ca[100005],at[100005],ta[100005],ct[100005],tc[100005],n,i,mac,mat,mct;
void init(std::string a, std::string b) {
n=a.length();
for (i=0;i<n;i++) {
if (i==0) {
ac[i]=0;
ca[i]=0;
at[i]=0;
ta[i]=0;
ct[i]=0;
tc[i]=0;
}
else {
ac[i]=ac[i-1];
ca[i]=ca[i-1];
at[i]=at[i-1];
ta[i]=ta[i-1];
ct[i]=ct[i-1];
tc[i]=tc[i-1];
}
if (a[i]=='A') {
if (b[i]=='C') {
ac[i]++;
}
else if (b[i]=='T') {
at[i]++;
}
}
else if (a[i]=='C') {
if (b[i]=='A') {
ca[i]++;
}
else if (b[i]=='T') {
ct[i]++;
}
}
else if (a[i]=='T') {
if (b[i]=='A') {
ta[i]++;
}
else if (b[i]=='C') {
tc[i]++;
}
}
}
}
int get_distance(int x, int y) {
if (ac[y]-ac[x-1]+at[y]-at[x-1]!=ca[y]-ca[x-1]+ta[y]-ta[x-1]) {
return -1;
}
if (ca[y]-ca[x-1]+ct[y]-ct[x-1]!=ac[y]-ac[x-1]+tc[y]-tc[x-1]) {
return -1;
}
if (ta[y]-ta[x-1]+tc[y]-tc[x-1]!=at[y]-at[x-1]+ct[y]-ct[x-1]) {
return -1;
}
mac=min(ac[y]-ac[x-1],ca[y]-ca[x-1]);
mat=min(at[y]-at[x-1],ta[y]-ta[x-1]);
mct=min(ct[y]-ct[x-1],tc[y]-tc[x-1]);
return mac+mat+mct+2*(max(ac[y]-ac[x-1],ca[y]-ca[x-1])-mac);
}