Submission #1048297

#TimeUsernameProblemLanguageResultExecution timeMemory
1048297AmirAli_H1Mutating DNA (IOI21_dna)C++17
100 / 100
32 ms13080 KiB
// In the name of Allah #include <bits/stdc++.h> #include "dna.h" using namespace std; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; #define endl '\n' #define sep ' ' #define F first #define S second #define all(x) (x).begin(),(x).end() #define len(x) ((ll) (x).size()) #define pb push_back #define Mp make_pair const int maxn = 2e5 + 7; int n; int A1[maxn], A2[maxn]; pair<int, pii> sm1[maxn], sm2[maxn]; int smx[3][3][maxn]; int val[3][3]; bool ok(int l, int r) { if (sm1[r].F - sm1[l].F != sm2[r].F - sm2[l].F) return 0; if (sm1[r].S.F - sm1[l].S.F != sm2[r].S.F - sm2[l].S.F) return 0; if (sm1[r].S.S - sm1[l].S.S != sm2[r].S.S - sm2[l].S.S) return 0; return 1; } void init(string a, string b) { n = len(a); for (int i = 1; i <= n; i++) { if (a[i - 1] == 'A') A1[i] = 0; else if (a[i - 1] == 'T') A1[i] = 1; else if (a[i - 1] == 'C') A1[i] = 2; if (b[i - 1] == 'A') A2[i] = 0; else if (b[i - 1] == 'T') A2[i] = 1; else if (b[i - 1] == 'C') A2[i] = 2; } for (int i = 1; i <= n; i++) { sm1[i].F = sm1[i - 1].F + (A1[i] == 0); sm1[i].S.F = sm1[i - 1].S.F + (A1[i] == 1); sm1[i].S.S = sm1[i - 1].S.S + (A1[i] == 2); sm2[i].F = sm2[i - 1].F + (A2[i] == 0); sm2[i].S.F = sm2[i - 1].S.F + (A2[i] == 1); sm2[i].S.S = sm2[i - 1].S.S + (A2[i] == 2); } for (int R1 = 0; R1 < 3; R1++) { for (int R2 = 0; R2 < 3; R2++) { for (int i = 1; i <= n; i++) { smx[R1][R2][i] = smx[R1][R2][i - 1] + (A1[i] == R1 && A2[i] == R2); } } } } int get_distance(int l, int r) { r++; if (!ok(l, r)) return -1; for (int R1 = 0; R1 < 3; R1++) { for (int R2 = 0; R2 < 3; R2++) { val[R1][R2] = smx[R1][R2][r] - smx[R1][R2][l]; } } ll res = 0; ll d1 = min(val[0][1], val[1][0]); val[0][1] -= d1; val[1][0] -= d1; res += d1; ll d2 = min(val[0][2], val[2][0]); val[0][2] -= d2; val[2][0] -= d2; res += d2; ll d3 = min(val[1][2], val[2][1]); val[1][2] -= d3; val[2][1] -= d3; res += d3; res += 2 * (val[0][1] + val[1][0]); return res; }
#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...