Submission #1195157

#TimeUsernameProblemLanguageResultExecution timeMemory
1195157DobromirAngelovMutating DNA (IOI21_dna)C++20
100 / 100
28 ms10400 KiB
#include "dna.h"
#include<bits/stdc++.h>

using namespace std;

const int MAXN=1e5+5;

int n;
int a[MAXN];
int b[MAXN];
int pref1[MAXN][4];
int pref2[MAXN][4];
int pref[MAXN][10];

int cd(int x,int y)
{
    if(x==1 && y==2) return 1;
    if(x==2 && y==1) return 2;
    if(x==3 && y==1) return 3;
    if(x==1 && y==3) return 4;
    if(x==2 && y==3) return 5;
    if(x==3 && y==2) return 6;
    return 0;
}

void init(std::string s1, std::string s2)
{
	n=s1.size();
	s1='$'+s1;
    s2='$'+s2;

    for(int i=1;i<=n;i++)
    {
        if(s1[i]=='A') a[i]=1;
        if(s1[i]=='C') a[i]=2;
        if(s1[i]=='T') a[i]=3;
    }
    for(int i=1;i<=n;i++)
    {
        if(s2[i]=='A') b[i]=1;
        if(s2[i]=='C') b[i]=2;
        if(s2[i]=='T') b[i]=3;
    }

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=3;j++) pref1[i][j]=pref1[i-1][j];
        for(int j=1;j<=3;j++) pref2[i][j]=pref2[i-1][j];
        pref1[i][a[i]]++;
        pref2[i][b[i]]++;
    }

    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=6;j++) pref[i][j]=pref[i-1][j];
        pref[i][cd(a[i],b[i])]++;
    }
}

int get_distance(int l, int r)
{
	l++; r++;

	bool fl=0;
	for(int j=1;j<=3;j++)
		if(pref1[r][j]-pref1[l-1][j]!=pref2[r][j]-pref2[l-1][j]) fl=1;
	if(fl) return -1;

	int ans=0;
	int s=0;
	for(int j=1;j<=3;j++)
	{
		int x=pref[r][2*j-1]-pref[l-1][2*j-1];
		int y=pref[r][2*j]-pref[l-1][2*j];
		ans+=min(x,y);
		s+=max(x,y)-min(x,y);
	}
	ans+=2*(s/3);
	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...