Submission #522977

#TimeUsernameProblemLanguageResultExecution timeMemory
522977marat0210Mutating DNA (IOI21_dna)C++17
56 / 100
39 ms8328 KiB
#include <dna.h> #include <bits/stdc++.h> using namespace std; vector <int> posa, posb; const int N = 500500; vector <int> pref(N); int values[2][2][N]; void init(string a, string b) { int n = a.size(); for (int i = 0; i < n; ++i) { if (a[i] == 'A') { posa.push_back(0); } else if (a[i] == 'T') { posa.push_back(1); } else if (a[i] == 'C') { posa.push_back(2); } if (b[i] == 'A') { posb.push_back(0); } else if (b[i] == 'T') { posb.push_back(1); } else if (b[i] == 'C') { posb.push_back(2); } } int cur = 0; for (int i = 0; i < n; ++i) { if (posa[i] != posb[i]) { cur++; pref[i] = cur; } else { if (i == 0) { pref[i] = 0; } else { pref[i] = pref[i - 1]; } } } int cnta = 0, cntt = 0; for (int i = 0; i < n; ++i) { if (posa[i] == 0) { cnta++; values[0][0][i] = cnta; if (i > 0) { values[0][1][i] = values[0][1][i - 1]; } } else if (posa[i] == 1) { cntt++; values[0][1][i] = cntt; if (i > 0) { values[0][0][i] = values[0][0][i - 1]; } } } cnta = 0, cntt = 0; for (int i = 0; i < n; ++i) { if (posb[i] == 0) { cnta++; values[1][0][i] = cnta; if (i > 0) { values[1][1][i] = values[1][1][i - 1]; } } else if (posb[i] == 1) { cntt++; values[1][1][i] = cntt; if (i > 0) { values[1][0][i] = values[1][0][i - 1]; } } } } int get_distance(int x, int y) { if (y - x == 2) { bool ok = true; for (int i = x; i <= y; ++i) { if (posa[i] != posb[i]) { ok = false; break; } } if (ok) { return 0; } int cnta = 0, cntt = 0, cntc = 0; for (int i = x; i <= y; ++i) { if (posa[i] == 0) { cnta++; } else if (posa[i] == 1) { cntt++; } else { cntc++; } } for (int i = x; i <= y; ++i) { if (posb[i] == 0) { cnta--; } else if (posb[i] == 1) { cntt--; } else { cntc--; } } if (cnta != 0 or cntt != 0 or cntc != 0) { return -1; } ok = false; for (int i = x; i <= y; ++i) { if (posa[i] == posb[i]) { ok = true; break; } } if (ok) { return 1; } else { return 2; } } else if (y - x == 1) { if (posa[x] == posb[x] and posa[y] == posb[y]) { return 0; } else if (posa[x] == posb[y] and posb[x] == posa[y]) { return 1; } else { return -1; } } else if (y - x == 0) { if (posa[x] == posb[x]) { return 0; } else { return -1; } } else { int cnta = 0, cntt = 0; if (x == 0) { cnta = values[0][0][y] - values[1][0][y]; cntt = values[0][1][y] - values[1][1][y]; } else { cnta = values[0][0][y] - values[0][0][x - 1] - values[1][0][y] + values[1][0][x - 1]; cntt = values[0][1][y] - values[0][1][x - 1] - values[1][1][y] + values[1][1][x - 1]; } if (cnta != 0 or cntt != 0) { return -1; } int cnt = 0; if (x == 0) { cnt = pref[y]; } else { cnt = pref[y] - pref[x - 1]; } int res = (cnt + 1) / 2; 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...