Submission #1175266

#TimeUsernameProblemLanguageResultExecution timeMemory
1175266raspyMutating DNA (IOI21_dna)C++20
56 / 100
25 ms4880 KiB
#include "dna.h"
#include <bits/stdc++.h>

using namespace std;

map<string, int> mp;
int n;
int kum[8][100005];

const string dnk[8] = {"AC", "AT", "CA", "CT", "TA", "TC"};
const int LIK = 6;

void init(string a, string b)
{
	for (int i = 0; i < LIK; i++)
		mp[dnk[i]] = i;
	n = a.size();
	for (int i = 1; i <= n; i++)
	{
		string tr(1, a[i-1]);
		tr += b[i-1];
		for (int ix = 0; ix < LIK; ix++)
			kum[ix][i] = kum[ix][i-1];
		if (a[i-1] != b[i-1])
			kum[mp[tr]][i]++;
	}
}

int tr_dnk[8];

int get_distance(int x, int y)
{
	for (int i = 0; i < LIK; i++)
	{
		tr_dnk[i] = kum[i][y+1]-kum[i][x];
		// cout << dnk[i] << ": " << tr_dnk[i] << "\n";
	}
	// cout << "====================\n";
	tr_dnk[0] -= tr_dnk[2]; // ac, ca
	tr_dnk[1] -= tr_dnk[4]; // at, ta
	tr_dnk[3] -= tr_dnk[5]; // ct, tc
	if (tr_dnk[0] == 0 && tr_dnk[1] == 0 && tr_dnk[3] == 0)
		return (tr_dnk[2]) + (tr_dnk[4]) + (tr_dnk[5]);
	if (tr_dnk[0] == 1 && tr_dnk[1] == -1 && tr_dnk[3] == 1)
		return 2+(tr_dnk[2]) + (tr_dnk[4]-1) + (tr_dnk[5]);
	if (tr_dnk[0] == -1 && tr_dnk[1] == 1 && tr_dnk[3] == -1)
		return 2+(tr_dnk[2]-1) + (tr_dnk[4]) + (tr_dnk[5]-1);
	return -1;
}
#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...