Submission #1278719

#TimeUsernameProblemLanguageResultExecution timeMemory
1278719IBoryMutating DNA (IOI21_dna)C++20
100 / 100
20 ms4840 KiB
#include "dna.h"
#include <algorithm>
using namespace std;

const int MAX = 100007;
int AC[MAX], AT[MAX], CA[MAX], CT[MAX], TA[MAX], TC[MAX];

void init(string a, string b) {
	for (int i = 1; i <= a.size(); ++i) {
		AC[i] = AC[i - 1] + (a[i - 1] == 'A' && b[i - 1] == 'C');
		AT[i] = AT[i - 1] + (a[i - 1] == 'A' && b[i - 1] == 'T');
		CA[i] = CA[i - 1] + (a[i - 1] == 'C' && b[i - 1] == 'A');
		CT[i] = CT[i - 1] + (a[i - 1] == 'C' && b[i - 1] == 'T');
		TA[i] = TA[i - 1] + (a[i - 1] == 'T' && b[i - 1] == 'A');
		TC[i] = TC[i - 1] + (a[i - 1] == 'T' && b[i - 1] == 'C');
	}
}

int get_distance(int x, int y) {
	x++; y++;
	int ret = 0;
	int ac = AC[y] - AC[x - 1];
	int at = AT[y] - AT[x - 1];
	int ca = CA[y] - CA[x - 1];
	int ct = CT[y] - CT[x - 1];
	int ta = TA[y] - TA[x - 1];
	int tc = TC[y] - TC[x - 1];
	int a1 = ac + at;
	int a2 = ca + ta;
	int c1 = ca + ct;
	int c2 = ac + tc;
	int t1 = ta + tc;
	int t2 = at + ct;

	a1 -= min(ac, ca) + min(at, ta);
	a2 -= min(ac, ca) + min(at, ta);
	c1 -= min(ac, ca) + min(ct, tc);
	c2 -= min(ac, ca) + min(ct, tc);
	t1 -= min(at, ta) + min(ct, tc);
	t2 -= min(at, ta) + min(ct, tc);

	ret += min(ac, ca) + min(at, ta) + min(ct, tc);
	if (a1 != a2 || c1 != c2 || t1 != t2) return -1;
	else if (a1 != 0) ret += a1 * 2;
	return ret;
}
#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...