Submission #1014853

#TimeUsernameProblemLanguageResultExecution timeMemory
1014853aufanMutating DNA (IOI21_dna)C++17
100 / 100
37 ms8256 KiB
// #include "dna.h"
#include <bits/stdc++.h>

using namespace std;
int n;
vector<vector<int>> pref(6, vector<int>(111111));
vector<vector<int>> pref2(3, vector<int>(111111));
void init(string a, string b) {
    map<string, int> cd;
    cd["AT"] = 0;
    cd["TC"] = 1;
    cd["CA"] = 2;
    cd["AC"] = 3;
    cd["CT"] = 4;
    cd["TA"] = 5;
    n = a.size();
    a = '?' + a;
    b = '?' + b;
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < 6; j++) {
            pref[j][i] = pref[j][i-1];
        }
        for (int j = 0; j < 3; j++) {
            pref2[j][i] = pref2[j][i-1];
        }
        pref2[(a[i] == 'A' ? 0 : a[i] == 'T' ? 1 : 2)][i]++;
        pref2[(b[i] == 'A' ? 0 : b[i] == 'T' ? 1 : 2)][i]--;
        if (a[i] == b[i]) continue;
        string x = "";
        x.push_back(a[i]);
        x.push_back(b[i]);
        pref[cd[x]][i]++;
    }
}

int get_distance(int x, int y) {
    ++x;
    ++y;
    vector<int> ct(6);
    for (int j = 0; j < 6; j++) {
        ct[j] = pref[j][y] - pref[j][x-1];
    }
    for (int j = 0; j < 3; j++) {
        if (pref2[j][y] - pref2[j][x-1] != 0) {
            return -1;
        }
    }
    int ans = 0;
    for (int j = 0; j < 3; j++) {
        int z = min(ct[j], ct[5-j]);
        ct[j] -= z;
        ct[5-j] -= z;
        ans += z;
    }
    ans += 2*(ct[0] + ct[3]);
    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...