Submission #978246

#TimeUsernameProblemLanguageResultExecution timeMemory
978246AmaarsaaMutating DNA (IOI21_dna)C++17
100 / 100
28 ms7180 KiB
#include "dna.h"
#include<bits/stdc++.h>

using namespace std;
int a[100004][3][3];
void init(string A, string B) {
	int n = A.size();
	for (int i = 0; i < n; i ++) {
		if ( A[i] == 'T') A[i] = 'B';
		if ( B[i] == 'T') B[i] = 'B';
		A[i] += 32;
		B[i] += 32;
		for (int j = 0; j <= 2; j ++) {
			for (int r = 0; r <= 2; r ++) {
				if ( i == 0) a[i][j][r] = 0;
				else a[i][j][r] = a[i - 1][j][r];		
			}
		}
		int x = A[i] - 'a';
		int y = B[i] - 'a';
		a[i][x][y] ++;
	}
}
int cnt(int l, int r, int x, int y){
	int s= a[r][x][y];
	if ( l == 0) return s;
	s -= (a[l - 1][x][y]);
	return s;
}
int get_distance(int x, int y) {
	int ans = 0;
	int ab = cnt(x, y, 0, 1), ba = cnt(x, y, 1, 0), ac = cnt(x, y, 0, 2), ca = cnt(x, y, 2, 0), bc = cnt(x, y, 1, 2), cb = cnt(x, y, 2, 1);
	x = min(ab, ba);
	ans += x;
	ab -= x;
	ba -= x;
	x = min(ac, ca);
	ans += x;
	ac -= x;
	ca -= x;
	x = min(bc, cb);
	ans += x;
	bc -= x;
	cb -= x;
	if ( ab == 0 && ba == 0 && ca == 0 && ac == 0 && bc == 0 && cb == 0) return ans;
	if ( (ab == 0 || bc == 0 || ca == 0) && (ba == 0 || ac == 0 || cb == 0)) return -1;
	ab += ba;
	bc += cb;
	ac += ca;
	int s = ab + bc + ac;
	if ( ac != ab || ac != bc || ab != bc) return -1;
	return ans + s - max(ab, max(bc, ac));
}
#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...