Submission #689520

#TimeUsernameProblemLanguageResultExecution timeMemory
689520ToxtaqMutating DNA (IOI21_dna)C++17
0 / 100
79 ms13584 KiB
#include<bits/stdc++.h>
#include "dna.h"
using namespace std;
struct T{
    int alph_A[3] = {0, 0, 0}, alph_B[3] = {0, 0, 0};
    int diff = 0;
};
string a, b;
struct SegTree{
    vector<T>sTree;
    T comb(T a, T b){
        T res;
        res.diff = a.diff + b.diff;
        for(int i = 0;i < 3;++i){
            res.alph_A[i] += a.alph_A[i];
            res.alph_A[i] += b.alph_A[i];
            res.alph_B[i] += a.alph_B[i];
            res.alph_B[i] += b.alph_B[i];
        }
        return res;
    }
    void Build(int node, int l, int r){
        if(l == r){
            sTree[node].diff = (a[l] != b[l]);
            if(a[l] == 'A')sTree[node].alph_A[0]++;
            if(a[l] == 'T')sTree[node].alph_A[1]++;
            if(a[l] == 'C')sTree[node].alph_A[2]++;
            if(b[l] == 'A')sTree[node].alph_B[0]++;
            if(b[l] == 'T')sTree[node].alph_B[1]++;
            if(b[l] == 'C')sTree[node].alph_B[2]++;
        }
        else{
            int mid = (l + r) >> 1;
            Build(node * 2, l, mid);
            Build(node * 2 + 1, mid + 1, r);
            sTree[node] = comb(sTree[node * 2], sTree[node * 2 + 1]);
        }
    }
    T Query(int node, int l, int r, int ql, int qr){
        T Res;
        if(ql <= l && r <= qr)return sTree[node];
        if(ql > r || qr < l)return Res;
        int mid = (l + r) >> 1;
        T Lc = Query(node * 2, l, mid, ql, qr);
        T Rc = Query(node * 2 + 1, mid + 1, r, ql, qr);
        Res = comb(Lc, Rc);
        return Res;
    }
};
SegTree st;
void init(string A, string B){
    a = " ", b = " ";
    a += A, b += B;
    st.sTree.resize(4 * A.length());
    st.Build(1, 1, A.length());
}
int get_distance(int x, int y){
    x++;
    y++;
    T q = st.Query(1, 1, a.length() - 1, x, y);
    for(int i = 0;i < 3;++i){
        if(q.alph_A[i] != q.alph_B[i])return -1;
    }
    return q.diff - 1;
}
//int main(){
//    init("ATACAT", "ACTATA");
//    cout << get_distance(3, 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...