Submission #832114

#TimeUsernameProblemLanguageResultExecution timeMemory
832114minhcoolMutating DNA (IOI21_dna)C++17
100 / 100
37 ms9676 KiB
//#define local
#ifndef local
#include "dna.h"
#endif
#include<bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
using namespace __gnu_pbds;
using namespace std;

//#define int long long
#define fi first
#define se second
#define pb push_back
#define mp make_pair

typedef pair<int, int> ii;
typedef pair<ii, int> iii;
typedef pair<ii, ii> iiii;

const int N = 1e5 + 5;

const int oo = 1e18 + 7, mod = 1e9 + 7;

mt19937 rng(1);

int rnd(int l, int r){
	int temp = rng() % (r - l + 1);
	return abs(temp) + l;
}

int n, pref1[N][3], pref2[N][3], pref3[N][3][3];

char c[] = {'C', 'A', 'T'};

void init(string a, string b) {
    n = a.length();
    a = '*' + a, b = '*' + b;
    //cout << "OK\n";
    //cout << a.length() << " " << b.length() << "\n";
    //return;
    for(int i = 1; i <= n; i++){
        for(int j = 0; j < 3; j++){
            pref1[i][j] = pref1[i - 1][j] + (a[i] == c[j]);
            pref2[i][j] = pref2[i - 1][j] + (b[i] == c[j]);
            for(int k = 0; k < 3; k++){
                pref3[i][j][k] = pref3[i - 1][j][k] + (a[i] == c[j] && b[i] == c[k]);
            }
        }
    }
}

int get_distance(int x, int y) {
    //return 0;
    x++, y++;
    for(int i = 0; i < 3; i++) if((pref1[y][i] - pref1[x - 1][i]) != (pref2[y][i] - pref2[x - 1][i])) return -1;
    int ca = (pref3[y][0][1] - pref3[x - 1][0][1]);
    int ct = (pref3[y][0][2] - pref3[x - 1][0][2]);
    int ac = (pref3[y][1][0] - pref3[x - 1][1][0]);
    int at = (pref3[y][1][2] - pref3[x - 1][1][2]);
    int tc = (pref3[y][2][0] - pref3[x - 1][2][0]);
    int ta = (pref3[y][2][1] - pref3[x - 1][2][1]);
    int answer = 0;
    int temp = min(ac, ca);
    ac -= temp, ca -= temp; answer += temp;
    temp = min(at, ta);
    at -= temp, ta -= temp, answer += temp;
    temp = min(ct, tc);
    ct -= temp, tc -= temp, answer += temp;
    //cout << ac << " " << ct << " " << ta << "\n";
    //cout << ca << " " << at << " " << tc << "\n";
    //assert(ac == ct && ct == ta);
    answer += ac * 2;
    //assert(ca == at && at == tc);
    answer += ca * 2;
    return answer;
	//return 0;
}

#ifdef local
void process(){

}

signed main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
    process();
}
#endif

Compilation message (stderr)

dna.cpp:22:21: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
   22 | const int oo = 1e18 + 7, mod = 1e9 + 7;
      |                ~~~~~^~~
#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...