Submission #806548

#TimeUsernameProblemLanguageResultExecution timeMemory
806548AlphaMale06Mutating DNA (IOI21_dna)C++17
100 / 100
30 ms6164 KiB
#include<bits/stdc++.h>
#include "dna.h"
using namespace std;
int n;
int pref[100010][6]; //0 ab 1 ba 2 ac 3 ca 4 bc 5 cb
void init(std::string a, std::string b) {
    n=a.size();
    for(int i=0; i< n; i++){
        for(int j=0; j< 6; j++)pref[i+1][j]=pref[i][j];
        if(a[i]=='A'){
            if(b[i]=='C'){
                pref[i+1][0]++;
            }
            else if(b[i]=='T'){
                pref[i+1][2]++;
            }
        }
        else if(a[i]=='C'){
            if(b[i]=='A'){
                pref[i+1][1]++;
            }
            else if(b[i]=='T'){
                pref[i+1][4]++;
            }
        }
        else{
            if(b[i]=='A'){
                pref[i+1][3]++;
            }
            else if(b[i]=='C'){
                pref[i+1][5]++;
            }
        }
    }
}

int get_distance(int x, int y) {
	int ab, ba, ac, ca, bc, cb;
	ab=pref[y+1][0]-pref[x][0];
	ba=pref[y+1][1]-pref[x][1];
	ac=pref[y+1][2]-pref[x][2];
	ca=pref[y+1][3]-pref[x][3];
	bc=pref[y+1][4]-pref[x][4];
	cb=pref[y+1][5]-pref[x][5];
	if(ab+ac!=ba+ca || ba+bc !=ab+cb || ca+cb!=ac+bc){
        return -1;
	}
	else{
        int ans=0;
        int ab1=min(ab, ba);
        int ac1=min(ac, ca);
        int bc1=min(bc, cb);
        ans+=ab1+ac1+bc1;
        ab-=ab1; ba-=ab1;
        return ans+max(ab, ba)*2;
	}
}
#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...