Submission #607645

#TimeUsernameProblemLanguageResultExecution timeMemory
607645jairRSMutating DNA (IOI21_dna)C++17
35 / 100
197 ms66496 KiB
#include "dna.h" #include <bits/stdc++.h> using namespace std; using vi = vector<int>; string ga, gb; map<char, vi> prefixCharA, prefixCharB; // prefix array of the positions where [c1][c2] c2 is in b instead of c1 map<char, map<char, int>> inPlaceOf[(int)1e5 + 1]; char characters[3] = {'A', 'T', 'C'}; void init(string a, string b) { int n = a.size(); ga = ' ' + a; gb = ' ' + b; for (char c : characters) { prefixCharA[c] = prefixCharB[c] = vi(n + 1, 0); for (int i = 1; i <= n; i++) { prefixCharA[c][i] = (ga[i] == c) + prefixCharA[c][i - 1]; prefixCharB[c][i] = (gb[i] == c) + prefixCharB[c][i - 1]; } } for (int i = 1; i <= n; i++) { for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) { if (k == j) continue; inPlaceOf[i][characters[j]][characters[k]] = inPlaceOf[i - 1][characters[j]][characters[k]]; } if (ga[i] != gb[i]) inPlaceOf[i][ga[i]][gb[i]]++; } } int get_distance(int x, int y) { x++, y++; bool pos = true; for (char c : characters) { int countInA = prefixCharA[c][y] - prefixCharA[c][x - 1]; int countInB = prefixCharB[c][y] - prefixCharB[c][x - 1]; pos &= (countInA == countInB); } if (!pos) return -1; int moves = 0; moves = inPlaceOf[y]['A']['T'] - inPlaceOf[x - 1]['A']['T']; return moves; }
#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...