제출 #576053

#제출 시각아이디문제언어결과실행 시간메모리
576053KrisjanisPDNA 돌연변이 (IOI21_dna)C++17
56 / 100
57 ms10880 KiB
#include "dna.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long ll;
const ll MX_N = 1e5;

ll ps[3][3][MX_N]; // ATC
void init(std::string a, std::string b) {
	ll n = a.size();
	for(ll i=0;i<n;i++)
	{
		ll av,bv;
		if(a[i]=='A') av=0;
		else if(a[i]=='T') av=1;
		else av=2;
		if(b[i]=='A') bv=0;
		else if(b[i]=='T') bv=1;
		else bv=2;
		ps[av][bv][i]++;
		if(i)
		{
			for(ll j=0;j<3;j++)
			{
				for(ll k=0;k<3;k++)
				{
					ps[j][k][i]+=ps[j][k][i-1];
				}
			}
		}
	}
}

int get_distance(int x, int y) {
	ll matrix[3][3];
	for(ll i=0;i<3;i++)
	{
		for(ll j=0;j<3;j++)
		{
			matrix[i][j] = ps[i][j][y];
			if(x)
				matrix[i][j] -= ps[i][j][x-1];
		}
	}
	ll cnt[2][3];
	for(ll i=0;i<2;i++)
		for(ll j=0;j<3;j++)
			cnt[i][j]=0;
	for(ll i=0;i<3;i++)
	{
		for(ll j=0;j<3;j++)
		{
			cnt[0][i] += matrix[i][j];
			cnt[1][j] += matrix[i][j];
		}
	}
	for(ll i=0;i<3;i++)
		if(cnt[0][i]!=cnt[1][i])
			return -1;
	ll res[2] = {}; // swaping, permuting
	for(ll i=0;i<3;i++)
	{
		for(ll j=i+1;j<3;j++)
		{
			ll mn = min(matrix[i][j],matrix[j][i]);
			ll mx = max(matrix[i][j],matrix[j][i]);
			res[0] += mn;
			res[1] += mx-mn;
		}
	}
	return res[0]+max(0ll,res[1]-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...