Submission #836958

#TimeUsernameProblemLanguageResultExecution timeMemory
836958FulopMateMutating DNA (IOI21_dna)C++17
100 / 100
32 ms6248 KiB
#include "dna.h"

#include <bits/stdc++.h>

using namespace std;

int n;
vector<int> ac, ca, at, ta, ct, tc;

void init(string a, string b) {
    n = a.length();
    ac.assign(n+1, 0);
    ca.assign(n+1, 0);
    at.assign(n+1, 0);
    ta.assign(n+1, 0);
    ct.assign(n+1, 0);
    tc.assign(n+1, 0);
    for(int i = 0; i < n; i++){
        if(a[i] == 'A' && b[i] == 'C')ac[i+1]++;
        if(a[i] == 'C' && b[i] == 'A')ca[i+1]++;
        if(a[i] == 'A' && b[i] == 'T')at[i+1]++;
        if(a[i] == 'T' && b[i] == 'A')ta[i+1]++;
        if(a[i] == 'C' && b[i] == 'T')ct[i+1]++;
        if(a[i] == 'T' && b[i] == 'C')tc[i+1]++;
        ac[i+1] += ac[i];
        ca[i+1] += ca[i];
        at[i+1] += at[i];
        ta[i+1] += ta[i];
        ct[i+1] += ct[i];
        tc[i+1] += tc[i];
    }
}

int get_distance(int x, int y) {
    int o_ac = ac[y+1]-ac[x];
    int o_ca = ca[y+1]-ca[x];
    int o_at = at[y+1]-at[x];
    int o_ta = ta[y+1]-ta[x];
    int o_ct = ct[y+1]-ct[x];
    int o_tc = tc[y+1]-tc[x];
    int ans = 0;
    int curr;

    curr = min(o_ac, o_ca);
    ans += curr;
    o_ac -= curr; o_ca -= curr;
    
    curr = min(o_at, o_ta);
    ans += curr;
    o_at -= curr; o_ta -= curr;
    
    curr = min(o_ct, o_tc);
    ans += curr;
    o_ct -= curr; o_tc -= curr;

    curr = min(o_ac, min(o_ct, o_ta));
    ans += curr*2;
    o_ac -= curr; o_ct -= curr; o_ta -= curr;

    curr = min(o_ca, min(o_tc, o_at));
    ans += curr*2;
    o_ca -= curr; o_tc -= curr; o_at -= curr;

    if(o_ac || o_ca || o_at || o_ta || o_ct || o_tc)return -1;
	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...