Submission #1195741

#TimeUsernameProblemLanguageResultExecution timeMemory
1195741LudisseyMutating DNA (IOI21_dna)C++20
100 / 100
58 ms33864 KiB
#include "dna.h"
#include <bits/stdc++.h>
#define sz(a) (int)a.size()
#define all(a) a.begin(), a.end()
#define rall(a) a.rbegin(), a.rend()
 
using namespace std;
vector<vector<int>> cA,cB;
vector<vector<vector<int>>> tA;
vector<int> A,B;


void init(std::string a, std::string b) {
	cA.clear();
	cB.clear();
	tA.clear();
	A.clear();
	B.clear();
	cA.resize(sz(a)+1,vector<int>(3,0));
	cB.resize(sz(a)+1,vector<int>(3,0));
	tA.resize(sz(a)+1,vector<vector<int>>(3,vector<int>(3,0)));
	A.resize(sz(a)+1,0);
	B.resize(sz(a)+1,0);
	for (int i = 1; i <= sz(a); i++)
	{
		char c=a[i-1];
		if(c=='A') A[i]=0;
		else if(c=='T') A[i]=1;
		else if(c=='C') A[i]=2;
		cA[i][A[i]]++;

		c=b[i-1];
		if(c=='A') B[i]=0;
		else if(c=='T') B[i]=1;
		else if(c=='C') B[i]=2;
		cB[i][B[i]]++;
		if(i>0){
			for (int j = 0; j < 3; j++)
			{
				cA[i][j]+=cA[i-1][j];
				cB[i][j]+=cB[i-1][j];
			}
		}
		tA[i][A[i]][B[i]]++;
		for (int j = 0; j < 3; j++)
		{
			for (int k = 0; k < 3; k++)
			{
				tA[i][j][k]+=tA[i-1][j][k];
			}
		}
	}
	
}

int get_distance(int x, int y) {
	x++;
	y++;
	for (int j = 0; j < 3; j++)
	{
		if(cA[y][j]-cA[x-1][j]!=cB[y][j]-cB[x-1][j]) return -1;
	}
	int sm=0;
	for (int j = 0; j < 3; j++)
	{
		for (int k = 0; k < 3; k++)
		{
			if(j==k) continue;
			sm+=tA[y][j][k]-tA[x-1][j][k];
		}
	}
	int rem=0;
	for (int j = 0; j < 3; j++)
	{
		for (int k = j+1; k < 3; k++)
		{
			rem+=min(tA[y][j][k]-tA[x-1][j][k],tA[y][k][j]-tA[x-1][k][j]);
		}
	}
	return max(0,(sm-rem*2)-(sm-rem*2)/3)+rem;
}
#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...