제출 #780162

#제출 시각아이디문제언어결과실행 시간메모리
780162LyricallyDNA 돌연변이 (IOI21_dna)C++17
100 / 100
43 ms8604 KiB
#include<bits/stdc++.h>
#include "dna.h"
using namespace std;
#define pii pair<int,int>
#define pb push_back
#define rep(i,n) for(int i=0;i<n;i++)
#define rep1(i,n) for(int i=1;i<=n;i++)
int pre[100005][6];
int acta[100005][3],actb[100005][3];
int n;
char trans(char p)
{
	return p=='A'?'a':(p=='C'?'b':'c');
}
void init(string a,string b)
{
	a=" "+a;b=" "+b;
	n=(int)a.size()-1;
	rep1(i,n)
	{
		a[i]=trans(a[i]);
		b[i]=trans(b[i]);
	}
	rep1(i,n)
	{
		rep(j,6){pre[i][j]=pre[i-1][j];}
		rep(j,3){acta[i][j]=acta[i-1][j];}
		acta[i][a[i]-'a']++;
		rep(j,3){actb[i][j]=actb[i-1][j];}
		actb[i][b[i]-'a']++;
		if(a[i]==b[i]){continue;}
		if(a[i]=='a'&&b[i]=='b'){pre[i][0]++;}
		if(a[i]=='a'&&b[i]=='c'){pre[i][1]++;}
		if(a[i]=='b'&&b[i]=='a'){pre[i][2]++;}
		if(a[i]=='b'&&b[i]=='c'){pre[i][3]++;}
		if(a[i]=='c'&&b[i]=='a'){pre[i][4]++;}
		if(a[i]=='c'&&b[i]=='b'){pre[i][5]++;}
	}
}
int get_distance(int x,int y)
{
	x++,y++;
	rep(i,3)
	{
		if(acta[y][i]-acta[x-1][i]!=actb[y][i]-actb[x-1][i])
		{
			return -1;
		}
	}
	int npre[6];
	rep(i,6)
	{
		npre[i]=pre[y][i]-pre[x-1][i];
	}
	int rans=min(npre[0],npre[2])+min(npre[1],npre[4])+min(npre[3],npre[5]);
	int X=min(npre[0],npre[2]),Y=min(npre[1],npre[4]),Z=min(npre[3],npre[5]);
	npre[0]-=X;
	npre[2]-=X;
	npre[1]-=Y;
	npre[4]-=Y;
	npre[3]-=Z;
	npre[5]-=Z;
	if(npre[0]||npre[1]||npre[2]||npre[3]||npre[4]||npre[5])
	{
		int mx=0;
		rep(i,6){mx=max(mx,npre[i]);}
		return rans+mx*2;
	}
	return rans;
}
#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...