Submission #1296638

#TimeUsernameProblemLanguageResultExecution timeMemory
1296638Ekber_EkberMutating DNA (IOI21_dna)C++20
56 / 100
48 ms8800 KiB
#include "dna.h"
#include <bits/stdc++.h>
#define endl "\n"
#define ff first
#define ss second
#define pb push_back
#define all(v) v.begin(), v.end()
using namespace std;
vector <int> pr[3][3];
vector <int> is1[3], is2[3];
map <char, int> m;

void init(string a, string b) {
	m['A'] = 0, m['T'] = 1, m['C'] = 2;
	int n = a.size();
	vector <int> x, y;
	for (int i = 0; i < 3; i++) {
		for (int j = 0; j < 3; j++) {
			pr[i][j].assign(n, 0);
		}
		is1[i].assign(n, 0);
		is2[i].assign(n, 0);
	}
	for (int i = 0; i < n; i++) {
		x.pb(m[a[i]]);
		y.pb(m[b[i]]);
	}
	// cerr << "String A: ";
	// // for (int &i : x) cerr << i; cerr << endl;
	// cerr << "String B: ";
	// // for (int &i : y) cerr << i; cerr << endl;
	for (int i = 0; i < n; i++) pr[x[i]][y[i]][i]++, is1[x[i]][i]++, is2[y[i]][i]++;
	for (int i = 1; i < n; i++) {
		for (int e = 0; e < 3; e++) {
			for (int e1 = 0; e1 < 3; e1++) pr[e][e1][i] += pr[e][e1][i-1];
			is1[e][i] += is1[e][i-1];
			is2[e][i] += is2[e][i-1];
		}
	}
}

int get(char x, char y, int l, int r) {
	int res = pr[m[x]][m[y]][r];
	if (l > 0) res -= pr[m[x]][m[y]][l-1];
	return res;
}

int get_distance(int l, int r) {
	int at = get('A', 'T', l, r);
	int ta = get('T', 'A', l, r);
	int ac = get('A', 'C', l, r);
	int ca = get('C', 'A', l, r);
	int tc = get('T', 'C', l, r);
	int ct = get('C', 'T', l, r);
	// cerr << "AT: " << at << "\nTA: " << ta << "\nTC: " << tc << "\nCT: " << ct << "\nCA: " << ca << "\nAC: " << ac << endl;
	int mn = min({at, tc, ca});
	at -= mn;
	tc -= mn;
	ca -= mn;
	int res = mn * 2;
	mn = min({ta, ac, ct});
	res += mn * 2;
	// cerr << res << endl;
	ta -= mn;
	ac -= mn;
	ct -= mn;
	if (at != ta || tc != ct || ac != ca) {
		return -1;
	}
	res += at + ct + ac;
	return res;
}
#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...