Submission #1009955

#TimeUsernameProblemLanguageResultExecution timeMemory
1009955UnluckyMutating DNA (IOI21_dna)C++17
100 / 100
107 ms6592 KiB
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;

string a, b;
map<string, int[100000]> prefix;

void init(string a1, string b1) {
	a = a1;
	b = b1;
	int n = a.length();
	for (int i = 0; i < n; i++){
		prefix["ta"][i+1] = (a[i] == 'T' && b[i] == 'A') ? prefix["ta"][i] + 1 : prefix["ta"][i];
		prefix["at"][i+1] = (a[i] == 'A' && b[i] == 'T') ? prefix["at"][i] + 1 : prefix["at"][i];
		prefix["tc"][i+1] = (a[i] == 'T' && b[i] == 'C') ? prefix["tc"][i] + 1 : prefix["tc"][i];
		prefix["ct"][i+1] = (a[i] == 'C' && b[i] == 'T') ? prefix["ct"][i] + 1 : prefix["ct"][i];
		prefix["ac"][i+1] = (a[i] == 'A' && b[i] == 'C') ? prefix["ac"][i] + 1 : prefix["ac"][i];
		prefix["ca"][i+1] = (a[i] == 'C' && b[i] == 'A') ? prefix["ca"][i] + 1 : prefix["ca"][i];
	}
}

int get_distance(int x, int y) {
	x++;
	y++;
	int ta = prefix["ta"][y] - prefix["ta"][x-1];
	int at = prefix["at"][y] - prefix["at"][x-1];
	int tc = prefix["tc"][y] - prefix["tc"][x-1];
	int ct = prefix["ct"][y] - prefix["ct"][x-1];
	int ac = prefix["ac"][y] - prefix["ac"][x-1];
	int ca = prefix["ca"][y] - prefix["ca"][x-1];
	int ret = 0;
	int m = min(ta, at);
	ta -= m;
	at -= m;
	ret += m;
	m = min(tc, ct);
	tc -= m;
	ct -= m;
	ret += m;
	m = min(ac, ca);
	ac -= m;
	ca -= m;
	ret += m;
	if (ta != ac || ta != ct){
		return -1;
	} else {
		ret += 2*ta;
	}
	if (at != ca || at != tc){
		return -1;
	} else {
		ret += 2*at;
	}
	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...