Submission #1149291

#TimeUsernameProblemLanguageResultExecution timeMemory
1149291ReLiceMutating DNA (IOI21_dna)C++20
100 / 100
48 ms9576 KiB
#include "dna.h"
#include <bits/stdc++.h>
#define ll int
#define vll vector<ll>
#define pb push_back
#define bc back()
using namespace std;
const ll N=2e5+7;
ll pref[3][3][N];
ll sum[3][N];
ll sum2[3][N];
vll s,s2;
void init(std::string a, std::string b) {
	map<char,ll> mp;
	mp['A']=0;
	mp['C']=1;
	mp['T']=2;
	for(int i=0;i<(ll)a.size();i++){
		s.pb(mp[a[i]]);
		s2.pb(mp[b[i]]);
		sum[s.bc][i]++;
		sum2[s2.bc][i]++;
		if(s.bc!=s2.bc)pref[s.bc][s2.bc][i]++;
		if(i==0)continue;
		for(int j=0;j<3;j++){
			for(int q=0;q<3;q++){
				pref[j][q][i]+=pref[j][q][i-1];
			}
		}
		for(int j=0;j<3;j++)sum[j][i]+=sum[j][i-1];
		for(int j=0;j<3;j++)sum2[j][i]+=sum2[j][i-1];
	}
}

int get_distance(int x, int y) {
	ll i,j,q;
	for(i=0;i<3;i++){
		if(x==0){
			if(sum[i][y]!=sum2[i][y])return -1;
			continue;
		}
		if(sum[i][y]-sum[i][x-1]!=sum2[i][y]-sum2[i][x-1])return -1;
	}
	ll ans=0;
	ll v[3][3];
	memset(v,0,sizeof(v));
	// edges
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			if(i==j)continue;
			ll a;
			if(x) a=pref[i][j][x-1];
			else a=0;
			v[i][j]=pref[i][j][y];
			v[i][j]-=a;
			ans+=v[i][j];
		}
	}
	// two cycles
	for(i=0;i<3;i++){
		for(j=i+1;j<3;j++){
			ll mn=min(v[i][j],v[j][i]);
			ans-=mn;
			v[i][j]-=mn;
			v[j][i]-=mn;
		}
	}
	
	//three cycles
	for(i=0;i<3;i++){
		for(j=0;j<3;j++){
			if(i==j)continue;
			for(q=0;q<3;q++){
				if(i==q || j==q)continue;
				ll mn=min(v[i][j],min(v[j][q],v[q][i]));
				ans-=mn;
				v[i][j]-=mn;
				v[j][q]-=mn;
				v[q][i]-=mn;
			}
		}
	}
	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...