Submission #753722

#TimeUsernameProblemLanguageResultExecution timeMemory
753722nicksmsMutating DNA (IOI21_dna)C++17
100 / 100
55 ms7628 KiB
#include <bits/stdc++.h>
using namespace std;
using ll=long long;
using db=long double;
template<class T> using V=vector<T>;
using vi = V<int>;
using vl = V<ll>;
using pi = pair<int,int>;
#define f first
#define s second
#define sz(x) (int)((x).size())

string A, B;
V<V<vi>> cnts(3,V<vi>(3));

void init(string a, string b) {
	A=a, B=b;
	map<char, int> m = {{'A',0}, {'T',1}, {'C',2}};
	for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) {
		cnts[i][j]=vi(sz(a)+1);
	}
	for (int i = 0; i < sz(a); i++) {
		cnts[m[a[i]]][m[b[i]]][i+1] = 1;
	}
	for (int i = 0; i < 3; i++) 
		for (int j = 0; j < 3; j++)
			for (int k = 0; k < sz(a); k++) 
				cnts[i][j][k+1] += cnts[i][j][k];
}

int get_distance(int x, int y) {
	vi t(3); 
	V<vi> e(3,vi(3));
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			t[i] += (e[i][j] = cnts[i][j][y+1]-cnts[i][j][x]);
			t[j] -= e[i][j];
		}
	}
	for (int i = 0; i < 3; i++) if (t[i]) return -1;
	int tot = 0;
	for (int i = 0; i < 3; i++) 
		for (int j = 0; j < 3; j++) if (i != j) {
			int m = min(e[i][j],e[j][i]);
			tot += m; e[i][j] -= m; e[j][i] -= m;
		}
	int rem = 0;
	for (int i = 0; i < 3; i++) for (int j = 0; j < 3; j++) if (i != j) rem += e[i][j];
	assert(rem % 3 == 0);
	return tot + 2*(rem/3);
}
#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...