제출 #1199373

#제출 시각아이디문제언어결과실행 시간메모리
1199373TimDeeDNA 돌연변이 (IOI21_dna)C++20
100 / 100
29 ms6152 KiB
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;
#define forn(i,n) for(int i=0; i<n; ++i)
#define pb push_back
#define all(x) x.begin(), x.end()

const int N=1e5+5;

int A[N], C[N], T[N];
int AA[N], AT[N], AC[N];
int CA[N], CT[N], CC[N];
int TA[N], TT[N], TC[N];

void init(string a, string b) {
	int n=a.size();
	forn(i,n) {
		A[i+1]=A[i]+(a[i]=='A')-(b[i]=='A');
		C[i+1]=C[i]+(a[i]=='C')-(b[i]=='C');
		T[i+1]=T[i]+(a[i]=='T')-(b[i]=='T');
		AT[i+1]=AT[i] + ( (a[i]=='A') && (b[i]=='T') );
		AC[i+1]=AC[i] + ( (a[i]=='A') && (b[i]=='C') );
		CT[i+1]=CT[i] + ( (a[i]=='C') && (b[i]=='T') );
		TC[i+1]=TC[i] + ( (a[i]=='T') && (b[i]=='C') );
		CA[i+1]=CA[i] + ( (a[i]=='C') && (b[i]=='A') );
		TA[i+1]=TA[i] + ( (a[i]=='T') && (b[i]=='A') );
	}
}
int get_distance(int x, int y) {
	int a = A[y+1]-A[x];
	if (a) return -1;
	int c = C[y+1]-C[x];
	if (c) return -1;
	int t = T[y+1]-T[x];
	if (t) return -1;

	int at=AT[y+1]-AT[x];
	int ct=CT[y+1]-CT[x];
	int ac=AC[y+1]-AC[x];
	int tc=TC[y+1]-TC[x];
	int ca=CA[y+1]-CA[x];
	int ta=TA[y+1]-TA[x];

	int ans=0;
	int z;
	z = min(at,ta);
	ans+=z;
	at-=z;
	ta-=z;

	z = min(ac,ca);
	ans+=z;
	ac-=z;
	ca-=z;

	z = min(ct,tc);
	ans+=z;
	ct-=z;
	tc-=z;

	ans+=2*(ac+ca);

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