Submission #1214100

#TimeUsernameProblemLanguageResultExecution timeMemory
1214100AvianshMutating DNA (IOI21_dna)C++20
100 / 100
30 ms6152 KiB
#include "dna.h"

#include <bits/stdc++.h>

using namespace std;

const int maxn = 1e5+5;
int numswaps[3][3][maxn];

int n;

int fin(char a){
    if(a=='A')
        return 0;
    if(a=='T')
        return 1;
    return 2;
}

void init(string a, string b) {
    n=a.size();
    for(int i = 0;i<3;i++){
        for(int j = 0;j<3;j++){
            fill(numswaps[i][j],numswaps[i][j]+n,0);
        }
    }
    numswaps[fin(a[0])][fin(b[0])][0]=1;
    for(int i = 1;i<n;i++){
        for(int s = 0;s<3;s++){
            for(int e = 0;e<3;e++){
                numswaps[s][e][i]=numswaps[s][e][i-1];
            }
        }
        numswaps[fin(a[i])][fin(b[i])][i]++;
    }
}

int get_distance(int x, int y) {
    int freq[3][3];
    for(int i = 0;i<3;i++){
        for(int j = 0;j<3;j++){
            freq[i][j]=numswaps[i][j][y];
            if(x){
                freq[i][j]-=numswaps[i][j][x-1];
            }
        }
    }
    if((freq[0][1]+freq[0][2]!=freq[1][0]+freq[2][0])||(freq[1][0]+freq[1][2]!=freq[0][1]+freq[2][1])||(freq[2][0]+freq[2][1]!=freq[0][2]+freq[1][2])){
        return -1;
    }
    //freqs are fine now.
    //so possible
    int ans = 0;
    for(int i = 0;i<3;i++){
        for(int j = 0;j<3;j++){
            if(i==j)
                continue;
            int a = min(freq[i][j],freq[j][i]);
            ans+=a;
            freq[i][j]-=a;
            freq[j][i]-=a;
        }
    }
    multiset<int>lef;
    for(int i = 0;i<3;i++){
        for(int j = 0;j<3;j++){
            if(i==j)
                continue;
            if(freq[i][j])
                lef.insert(freq[i][j]);
        }
    }
    if(lef.size()==0){
        return ans;
    }
    assert(lef.size()==3);
    ans+=(*lef.begin());
    ans+=((*(--lef.end()))+(*(--(--lef.end()))))/2;
	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...