Submission #569522

#TimeUsernameProblemLanguageResultExecution timeMemory
569522PiejanVDCMutating DNA (IOI21_dna)C++17
100 / 100
98 ms20368 KiB
#include <bits/stdc++.h> #include "dna.h" using namespace std; vector<vector<int>>v; vector<vector<int>>cntA,cntB; int T(char a, char b) { if(a == 'A' && b == 'T') return 0; if(a == 'T' && b == 'A') return 1; if(a == 'C' && b == 'T') return 2; if(a == 'T' && b == 'C') return 3; if(a == 'C' && b == 'A') return 4; if(a == 'A' && b == 'C') return 5; return 100; } void init(string a, string b) { const int n = (int)a.length(); v.resize(n+1, vector<int>(6,0)); cntA.resize(n+1, vector<int>(3, 0)); cntB.resize(n+1, vector<int>(3, 0)); for(int i = 1 ; i <= n ; i++) { for(int j = 0 ; j < 6 ; j++) { v[i][j] = v[i-1][j]; if(T(a[i-1], b[i-1]) == j) v[i][j]++; } } for(int i = 1 ; i <= n ; i++) { for(int j = 0 ; j < 3 ; j++) { cntA[i][j] = cntA[i-1][j]; cntB[i][j] = cntB[i-1][j]; if(j == 0 && a[i-1] == 'A') cntA[i][j]++; if(j == 1 && a[i-1] == 'T') cntA[i][j]++; if(j == 2 && a[i-1] == 'C') cntA[i][j]++; if(j == 0 && b[i-1] == 'A') cntB[i][j]++; if(j == 1 && b[i-1] == 'T') cntB[i][j]++; if(j == 2 && b[i-1] == 'C') cntB[i][j]++; } } } int get_distance(int x, int y) { x++,y++; vector<int>t(6); for(int i = 0 ; i < 6 ; i++) t[i] = v[y][i] - v[x-1][i]; for(int i = 0 ; i < 3 ; i++) { if(cntA[y][i] - cntA[x-1][i] != cntB[y][i] - cntB[x-1][i]) return -1; } int ans = 0; for(int i = 0 ; i < 6 ; i += 2) { int mn = min(t[i], t[i+1]); ans += mn; t[i] -= mn, t[i+1] -= mn; } int total = 0; for(auto z : t) total += z; if(total%3) return -1; ans += (total/3) * 2; return ans; }
#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...