Submission #1043806

#TimeUsernameProblemLanguageResultExecution timeMemory
1043806DeathIsAweMutating DNA (IOI21_dna)C++17
100 / 100
22 ms9780 KiB
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;
int pairprefix[100001][9], prefixa[100001][3], prefixb[100001][3];



void init(string a, string b) {
	for (int i=0;i<9;i++) {
		pairprefix[0][i] = 0;
	}
	for (int i=0;i<3;i++) {
		prefixa[0][i] = 0; prefixb[0][i] = 0;
	}
	for (int i=1;i<a.length() + 1;i++) {
		for (int j=0;j<3;j++) {
			prefixa[i][j] = prefixa[i-1][j]; prefixb[i][j] = prefixb[i-1][j];
		}
		for (int j=0;j<9;j++) {
			pairprefix[i][j] = pairprefix[i-1][j];
		}
		if (a[i - 1] == 'A' && b[i - 1] == 'A') {
			prefixa[i][0]++; prefixb[i][0]++;
			pairprefix[i][0]++;
		} else if (a[i - 1] == 'A' && b[i - 1] == 'T') {
			prefixa[i][0]++; prefixb[i][1]++;
			pairprefix[i][1]++;
		} else if (a[i - 1] == 'A' && b[i - 1] == 'C') {
			prefixa[i][0]++; prefixb[i][2]++;
			pairprefix[i][2]++;
		} else if (a[i - 1] == 'T' && b[i - 1] == 'A') {
			prefixa[i][1]++; prefixb[i][0]++;
			pairprefix[i][3]++;
		} else if (a[i - 1] == 'T' && b[i - 1] == 'T') {
			prefixa[i][1]++; prefixb[i][1]++;
			pairprefix[i][4]++;
		} else if (a[i - 1] == 'T' && b[i - 1] == 'C') {
			prefixa[i][1]++; prefixb[i][2]++;
			pairprefix[i][5]++;
		} else if (a[i - 1] == 'C' && b[i - 1] == 'A') {
			prefixa[i][2]++; prefixb[i][0]++;
			pairprefix[i][6]++;
		} else if (a[i - 1] == 'C' && b[i - 1] == 'T') {
			prefixa[i][2]++; prefixb[i][1]++;
			pairprefix[i][7]++;
		} else {
			prefixa[i][2]++; prefixb[i][2]++;
			pairprefix[i][8]++;
		} 
	}
}

int get_distance(int x, int y) {
	for (int i=0;i<3;i++) {
		if (prefixa[y+1][i] - prefixa[x][i] != prefixb[y+1][i] - prefixb[x][i]) {
			return -1;
		}
	}
	

	int ans = 0;
	int AB = pairprefix[y+1][1] - pairprefix[x][1];
	int AC = pairprefix[y+1][2] - pairprefix[x][2];
	int BA = pairprefix[y+1][3] - pairprefix[x][3];
	int BC = pairprefix[y+1][5] - pairprefix[x][5];
	int CA = pairprefix[y+1][6] - pairprefix[x][6];
	int CB = pairprefix[y+1][7] - pairprefix[x][7];


	if (AB > BA) {
		ans += BA;
		AB -= BA; BA = 0; 
	} else {
		ans += AB;
		BA -= AB; AB = 0; 
	}
	if (AC > CA) {
		ans += CA;
		AC -= CA; CA = 0; 
	} else {
		ans += AC;
		CA -= AC; AC = 0; 
	}
	if (BC > CB) {
		ans += CB;
		BC -= CB; CB = 0; 
	} else {
		ans += BC;
		CB -= BC; BC = 0; 
	}
	return ans + 2 * max(AB,BA);
}

Compilation message (stderr)

dna.cpp: In function 'void init(std::string, std::string)':
dna.cpp:15:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   15 |  for (int i=1;i<a.length() + 1;i++) {
      |               ~^~~~~~~~~~~~~~~
#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...