Submission #1253025

#TimeUsernameProblemLanguageResultExecution timeMemory
1253025antonnMutating DNA (IOI21_dna)C++20
0 / 100
25 ms8448 KiB
#include<bits/stdc++.h> using namespace std; typedef long long ll; template<typename T> bool assign_min(T& a, T b) { if (a > b) { a = b; return true; } return false; } template<typename T> bool assign_max(T& a, T b) { if (a < b) { a = b; return true; } return false; } const int N = 1e5 + 7; vector<int> prefAA, prefAT, prefAC; vector<int> prefBA, prefBT, prefBC; int pref[N][3][3]; vector<int> pr; int code(char c) { if (c == 'A') { return 0; } if (c == 'T') { return 1; } if (c == 'C') { return 2; } } void init(string a, string b) { int n = a.size(); prefAA.resize(n + 1); prefAT.resize(n + 1); prefAC.resize(n + 1); for (int i = 1; i <= a.size(); i++) { prefAA[i] = prefAA[i - 1] + (a[i - 1] == 'A'); prefAT[i] = prefAT[i - 1] + (a[i - 1] == 'T'); prefAC[i] = prefAC[i - 1] + (a[i - 1] == 'C'); } prefBA.resize(n + 1); prefBT.resize(n + 1); prefBC.resize(n + 1); for (int i = 1; i <= b.size(); i++) { prefBA[i] = prefBA[i - 1] + (b[i - 1] == 'A'); prefBT[i] = prefBT[i - 1] + (b[i - 1] == 'T'); prefBC[i] = prefBC[i - 1] + (b[i - 1] == 'C'); } pr.resize(n + 1); for (int i = 1; i <= n; i++) { pr[i] = pr[i - 1] + (a[i - 1] != b[i - 1]); } for (int i = 1; i <= n; i++) { for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) { pref[i][j][k] = pref[i - 1][j][k]; if (code(a[i - 1]) == j && code(b[i - 1]) == k) { pref[i][j][k]++; } } } } } int get_distance(int x, int y) { x++; y++; if (prefAA[y] - prefAA[x - 1] != prefBA[y] - prefBA[x - 1]) { return -1; } if (prefAT[y] - prefAT[x - 1] != prefBT[y] - prefBT[x - 1]) { return -1; } if (prefAC[y] - prefAC[x - 1] != prefBC[y] - prefBC[x - 1]) { return -1; } int ans = 0; int X = min(pref[y][0][1] - pref[x - 1][0][1], pref[y][1][0] - pref[x - 1][1][0]); int Y = min(pref[y][0][2] - pref[x - 1][0][2], pref[y][2][0] - pref[x - 1][2][0]); int Z = min(pref[y][1][2] - pref[x - 1][1][2], pref[y][2][1] - pref[x - 1][2][1]); ans += X + Y + Z; int ra = prefAA[y] - prefAA[x - 1] - X - Y; int rt = prefAT[y] - prefAT[x - 1] - X - Z; int rc = prefAC[y] - prefAC[x - 1] - Y - Z; ll m = min(ra, min(rt, rc)); ans += m * 2; ra -= m; rt -= m; rc -= m; ans += max(0, max(ra, max(rt, rc)) - 1); return ans; }

Compilation message (stderr)

dna.cpp: In function 'int code(char)':
dna.cpp:42:1: warning: control reaches end of non-void function [-Wreturn-type]
   42 | }
      | ^
#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...