Submission #1230708

#TimeUsernameProblemLanguageResultExecution timeMemory
1230708rxlfd314Mutating DNA (IOI21_dna)C++20
100 / 100
39 ms4880 KiB
#include "dna.h" #include <bits/stdc++.h> using namespace std; using ll = long long; using ari2 = array<int, 2>; using ari3 = array<int, 3>; using arl2 = array<ll, 2>; using arl3 = array<ll, 3>; template <class T> using vt = vector<T>; #define all(x) begin(x), end(x) #define size(x) (int((x).size())) #define REP(a,b,c,d) for(int a=(b);(d)>0?a<=(c):a>=(c);a+=(d)) #define FOR(a,b,c) REP(a,b,c,1) #define ROF(a,b,c) REP(a,b,c,-1) constexpr int mxN = 100005; int psum[mxN][6]; map<array<char, 2>, int> mm = {{{'A', 'T'}, 0}, {{'T', 'A'}, 1}, {{'A', 'C'}, 2}, {{'C', 'A'}, 3}, {{'C', 'T'}, 4}, {{'T', 'C'}, 5}}; void init(const string A, const string B) { const int N = size(A); FOR(i, 0, N-1) { FOR(j, 0, 5) psum[i+1][j] = psum[i][j]; if (A[i] != B[i]) psum[i+1][mm[{A[i], B[i]}]]++; } } int get_distance(const int x, const int y) { vt<int> cnt(6); FOR(i, 0, 5) cnt[i] = psum[y+1][i] - psum[x][i]; int ans = 0; REP(i, 0, 4, 2) { const int v = min(cnt[i], cnt[i+1]); ans += v; cnt[i] -= v; cnt[i+1] -= v; } vt<int> pos; FOR(i, 0, 5) if (cnt[i]) pos.push_back(i); if (!size(pos)) return ans; if (size(pos) != 3 || pos != vt<int>{0, 3, 5} && pos != vt<int>{1, 2, 4} || cnt[pos[0]] != cnt[pos[1]] || cnt[pos[0]] != cnt[pos[2]]) return -1; return ans + cnt[pos[0]] * 2; }
#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...