Submission #1312286

#TimeUsernameProblemLanguageResultExecution timeMemory
1312286opeleklanosMutating DNA (IOI21_dna)C++20
100 / 100
30 ms6452 KiB
#include <iostream>
#include <vector>
#include "dna.h"
using namespace std;

string a;
string b;

vector<int> dp[3][3];

int curr[3][3];

void init(string a1, string b1){
    a = a1;
    b = b1;
    int n = a.size();
    for(int i = 0; i<n; i++){
        if(a[i] == 'T') a[i] = '0';
        else if(a[i] == 'C') a[i] = '1';
        else if(a[i] == 'A') a[i] = '2';
        if(b[i] == 'T') b[i] = '0';
        else if(b[i] == 'C') b[i] = '1';
        else if(b[i] == 'A') b[i] = '2';
    }
    for(int i = 0; i<3; i++){
        for(int j = 0; j<3; j++) dp[i][j].assign(n, 0);
    }
    for(int i = 0; i<n; i++){
        for(int ai = 0; ai<3; ai++){
            for(int bi = 0; bi<3; bi++){
                dp[ai][bi][i] = (i>0?dp[ai][bi][i-1]:0) + (a[i]-'0' == ai && b[i]-'0' == bi);
            }
        }
    }
}

int get_distance(int l, int r){
    for(int i = 0; i<3; i++){
        for(int j = 0; j<3; j++){
            curr[i][j] = dp[i][j][r] - (l>0?dp[i][j][l-1]:0);
        }
    }
    
    int moves = 0;
    for(int i = 0; i<3; i++){
        for(int j = 0; j<3; j++){
            if(i == j || curr[i][j] == 0) continue;
            if(curr[j][i] >= curr[i][j]){
                curr[j][i] -= curr[i][j];
                moves += curr[i][j];
                curr[i][j] = 0;
            }
            else{
                moves += curr[j][i];
                curr[i][j] -= curr[j][i];
                curr[j][i] = 0;
                int k = 0;
                while(k==j || k==i) k++;
                if(curr[k][i] < curr[i][j]) return -1;
                curr[k][i] -= curr[i][j];
                curr[k][j] += curr[i][j];
                moves += curr[i][j];
                curr[i][j] = 0;
            }
        }
    }

    return moves;
}

// int main(void){
//     freopen("input.txt", "r", stdin);
//     string a1, b1; 
//     int q;
//     cin>>a1>>b1>>q;
//     init(a1, b1);
//     for(int i = 0; i<q; i++){
//         int l, r; cin>>l>>r;
//         cout<<get_distance(l, r)<<endl;
//     }
// }
#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...