제출 #438403

#제출 시각아이디문제언어결과실행 시간메모리
438403DecapitatedODNA 돌연변이 (IOI21_dna)C++17
100 / 100
56 ms8856 KiB
#include <bits/stdc++.h> #include "dna.h" using namespace std; int n; string dna1; string dna2; vector<pair<int, int>> as; vector<pair<int, int>> cs; vector<pair<int, int>> ts; vector<int> c_a; vector<int> c_t; vector<int> a_c; vector<int> a_t; vector<int> t_c; vector<int> t_a; void init(std::string a, std::string b) { n = a.size(); dna1 = a; dna2 = b; as.resize(n + 1, {0, 0}); cs.resize(n + 1, {0, 0}); ts.resize(n + 1, {0, 0}); c_a.resize(n + 1, 0); c_t.resize(n + 1, 0); a_c.resize(n + 1, 0); a_t.resize(n + 1, 0); t_c.resize(n + 1, 0); t_a.resize(n + 1, 0); for (int i = 1; i <= n; i++) { as[i].first = as[i - 1].first + (dna1[i - 1] == 'A' ? 1 : 0); as[i].second = as[i - 1].second + (dna2[i - 1] == 'A' ? 1 : 0); cs[i].first = cs[i - 1].first + (dna1[i - 1] == 'C' ? 1 : 0); cs[i].second = cs[i - 1].second + (dna2[i - 1] == 'C' ? 1 : 0); ts[i].first = ts[i - 1].first + (dna1[i - 1] == 'T' ? 1 : 0); ts[i].second = ts[i - 1].second + (dna2[i - 1] == 'T' ? 1 : 0); c_a[i] = c_a[i - 1] + (dna2[i - 1] == 'C' && dna1[i - 1] == 'A' ? 1 : 0); c_t[i] = c_t[i - 1] + (dna2[i - 1] == 'C' && dna1[i - 1] == 'T' ? 1 : 0); a_c[i] = a_c[i - 1] + (dna2[i - 1] == 'A' && dna1[i - 1] == 'C' ? 1 : 0); a_t[i] = a_t[i - 1] + (dna2[i - 1] == 'A' && dna1[i - 1] == 'T' ? 1 : 0); t_c[i] = t_c[i - 1] + (dna2[i - 1] == 'T' && dna1[i - 1] == 'C' ? 1 : 0); t_a[i] = t_a[i - 1] + (dna2[i - 1] == 'T' && dna1[i - 1] == 'A' ? 1 : 0); } } int get_distance(int x, int y) { if (as[y + 1].first - as[x].first != as[y + 1].second - as[x].second) return -1; if (cs[y + 1].first - cs[x].first != cs[y + 1].second - cs[x].second) return -1; if (ts[y + 1].first - ts[x].first != ts[y + 1].second - ts[x].second) return -1; int ca = c_a[y + 1] - c_a[x]; int ct = c_t[y + 1] - c_t[x]; int ac = a_c[y + 1] - a_c[x]; int at = a_t[y + 1] - a_t[x]; int tc = t_c[y + 1] - t_c[x]; int ta = t_a[y + 1] - t_a[x]; int ans = 0, mn; bool b = false; mn = min(ca, ac); ans += mn; ca -= mn; ac -= mn; if ((ca || ac) && !b) { b = true; ans += 2 * max(ca, ac); } mn = min(ct, tc); ans += mn; ct -= mn; tc -= mn; if ((ct || tc) && !b) { b = true; ans += 2 * max(ct, tc); } mn = min(at, ta); ans += mn; at -= mn; ta -= mn; if ((at || ta) && !b) { b = true; ans += 2 * max(at, ta); } 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...