Submission #1255778

#TimeUsernameProblemLanguageResultExecution timeMemory
1255778ereringMutating DNA (IOI21_dna)C++20
100 / 100
43 ms27144 KiB
#include <bits/stdc++.h>
#include "dna.h"
using namespace std;
const int MAXN=1e5+5;
int pref[MAXN][27][2];
int cnt[MAXN][3][3];
void init(std::string a, std::string b) {
    for(int i=0;i<a.size();i++){
        int x=0,y=0;
        if(a[i]=='C')x=1;
        if(a[i]=='T')x=2;
        if(b[i]=='C')y=1;
        if(b[i]=='T')y=2;
        cnt[i][x][y]++;
        pref[i][a[i]-'A'][0]++;
        pref[i][b[i]-'A'][1]++;
        if(i>0){
            for(int j=0;j<3;j++){
                for(int k=0;k<3;k++){
                    cnt[i][j][k]+=cnt[i-1][j][k];
                }
            }
            for(int j=0;j<26;j++){
                pref[i][j][0]+=pref[i-1][j][0];
                pref[i][j][1]+=pref[i-1][j][1];
            }
        }
    }
}

int get_distance(int x, int y) {
    for(int j=0;j<26;j++){
        if(pref[y][j][0]-(x>0?pref[x-1][j][0]:0)!=pref[y][j][1]-(x>0?pref[x-1][j][1]:0))return -1;
    }
    int ans=0;
    bool flag=0;
    for(int i=0;i<3;i++){
        for(int j=i+1;j<3;j++){
            int sc1=cnt[y][i][j]-(x>0?cnt[x-1][i][j]:0);
            int sc2=cnt[y][j][i]-(x>0?cnt[x-1][j][i]:0);
            ans+=min(sc1,sc2);
            if(sc1>sc2 && !flag){
                ans+=2*(sc1-sc2);
                flag=1;
            }
        }
    }
	return ans;
}
/*
 * act  cat
 * cta
 */
#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...