Submission #1064648

#TimeUsernameProblemLanguageResultExecution timeMemory
1064648glupanMutating DNA (IOI21_dna)C++17
35 / 100
33 ms8956 KiB
#include <bits/stdc++.h>

using namespace std;

string a,b;
int n;
int cntA[2][100005], cntC[2][100005], cntT[2][100005], pref[6][100005];

void init(string A, string B) {
    a = A;
    b = B;
    n = a.length();
    memset(pref,0,sizeof pref);
    memset(cntA,0,sizeof cntA);
    memset(cntC,0,sizeof cntC);
    memset(cntT,0,sizeof cntT);
    for(int i=0; i<n; i++) {
        if(a[i] != b[i]) {
            if(a[i] == 'A') {
                if(b[i] == 'T')
                    pref[0][i]++;
                else if(b[i] == 'C')
                    pref[1][i]++;
            }
            else if(a[i] == 'T') {
                if(b[i] == 'A')
                    pref[2][i]++;
                else if(b[i] == 'C')
                    pref[3][i]++;
                }
            else if(a[i] == 'C') {
                if(b[i] == 'A')
                    pref[4][i]++;
                else if(b[i] == 'T')
                    pref[5][i]++;
            }
        }
        if(a[i] == 'A')
            cntA[0][i]++;
        else if(a[i] == 'C')
            cntC[0][i]++;
        else if(a[i] == 'T')
            cntT[0][i]++;
        if(b[i] == 'A')
            cntA[1][i]++;
        else if(b[i] == 'C')
            cntC[1][i]++;
        else if(b[i] == 'T')
            cntT[1][i]++;
        if(i) {
            pref[0][i]+=pref[0][i-1];
            pref[1][i]+=pref[1][i-1];
            pref[2][i]+=pref[2][i-1];
            pref[3][i]+=pref[3][i-1];
            pref[4][i]+=pref[4][i-1];
            pref[5][i]+=pref[5][i-1];
            cntA[0][i]+=cntA[0][i-1];
            cntC[0][i]+=cntC[0][i-1];
            cntT[0][i]+=cntT[0][i-1];
            cntA[1][i]+=cntA[1][i-1];
            cntC[1][i]+=cntC[1][i-1];
            cntT[1][i]+=cntT[1][i-1];
        }
    }
}

int get_distance(int x, int y) {
    int numA[2], numC[2], numT[2];
    numA[0] = cntA[0][y];
    numC[0] = cntC[0][y];
    numT[0] = cntT[0][y];
    if(x) {
        numA[0]-=cntA[0][x-1];
        numC[0]-=cntC[0][x-1];
        numT[0]-=cntT[0][x-1];
    }
    numA[1] = cntA[1][y];
    numC[1] = cntC[1][y];
    numT[1] = cntT[1][y];
    if(x) {
        numA[1]-=cntA[1][x-1];
        numC[1]-=cntC[1][x-1];
        numT[1]-=cntT[1][x-1];
    }
    if(numA[0] != numA[1] or numC[0] != numC[1] or numT[0] != numT[1])
        return -1;
    int cnt[6];
    for(int i=0; i<6; i++)
        cnt[i] = pref[i][y];
    if(x)
        for(int i=0; i<6; i++)
            cnt[i]-=pref[i][x-1];
    return (max(cnt[0],cnt[2])+max(cnt[1],cnt[4])+max(cnt[3],cnt[5]));
}
#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...