제출 #1161179

#제출 시각아이디문제언어결과실행 시간메모리
1161179kl0989eDNA 돌연변이 (IOI21_dna)C++20
100 / 100
129 ms33156 KiB
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;

#define ll long long
#define fi first
#define se second
#define pb push_back
#define vi vector<int>
#define vl vector<ll>
#define pi pair<int, int>
#define pl pair<ll,ll>
#define all(x) (x).begin(),(x).end()

const int maxn=1e5+10;
vector<vector<vi>> pref(maxn,vector<vi>(3,vi(3,0)));
vector<vi> prefa(maxn,vi(3,0));
vector<vi> prefb(maxn,vi(3,0));
int n;

map<char,int> gt={{'A',0},{'T',1},{'C',2}};

void init(string a, string b) {
	n=a.size();
	for (int i=0; i<n; i++) {
		pref[i+1]=pref[i];
		pref[i+1][gt[a[i]]][gt[b[i]]]++;
		prefa[i+1]=prefa[i];
		prefa[i+1][gt[a[i]]]++;
		prefb[i+1]=prefb[i];
		prefb[i+1][gt[b[i]]]++;
	}
}

int get_distance(int x, int y) {
	for (int i=0; i<3; i++) {
		if (prefa[y+1][i]-prefa[x][i]!=prefb[y+1][i]-prefb[x][i]) {
			return -1;
		}
	}
	int ans=0;
	vector<vi> temp(3,vi(3,0));
	for (int i=0; i<3; i++) {
		for (int j=0; j<3; j++) {
			temp[i][j]=pref[y+1][i][j]-pref[x][i][j];
		}
	}
	for (int i=0; i<3; i++) {
		for (int j=i+1; j<3; j++) {
			int t=min(temp[i][j],temp[j][i]);
			ans+=t;
			temp[i][j]-=t;
			temp[j][i]-=t;
		}
	}
	ans+=2*temp[0][1];
	ans+=2*temp[1][0];
	return ans;
}
#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...