Submission #1271307

#TimeUsernameProblemLanguageResultExecution timeMemory
1271307nerrrminMutating DNA (IOI21_dna)C++20
100 / 100
41 ms8264 KiB
#include "dna.h" #define pb push_back #include <bits/stdc++.h> using namespace std; const int maxn = 2e5 + 10; int n, prefa[maxn][3], prefb[maxn][3]; int is_cool[maxn], cool[maxn]; vector < pair < char, char > > g; string aa, bb; map < pair < char, char >, int > tip; /// 0 A C /// 1 A T /// 2 C T /// 3 T C /// 4 T A /// 5 C A int pref[maxn][6]; void init(std::string a, std::string b) { n = a.size(); aa = a; bb = b; g.pb(make_pair('A', 'C')); g.pb(make_pair('A', 'T')); g.pb(make_pair('C', 'T')); g.pb(make_pair('T', 'C')); g.pb(make_pair('T', 'A')); g.pb(make_pair('C', 'A')); for (int i = 0; i < 6; ++ i) { pair < char, char > curr = g[i]; tip[curr] = i; } for (int i = 0; i < a.size(); ++ i) { for (int j = 0; j < 3 && i; ++ j) prefa[i][j] = prefa[i-1][j]; if(a[i] == 'A')prefa[i][0] ++; else if(a[i] == 'T')prefa[i][1] ++; else prefa[i][2] ++; } for (int i = 0; i < b.size(); ++ i) { for (int j = 0; j < 3 && i; ++ j) prefb[i][j] = prefb[i-1][j]; if(b[i] == 'A')prefb[i][0] ++; else if(b[i] == 'T')prefb[i][1] ++; else prefb[i][2] ++; } for (int i = 0; i < n; ++ i) { if(i)cool[i] = cool[i-1]; if(a[i] == b[i])is_cool[i] = 1; cool[i] += is_cool[i]; } for (int i = 0; i < n; ++ i) { if(i) { for (int j = 0; j < 6; ++ j) pref[i][j] = pref[i-1][j]; } if(a[i] == b[i])continue; pair < char, char> curr = make_pair(a[i], b[i]); int nomerche = tip[curr]; pref[i][nomerche] ++; } } int geta(int lt, int rt, int t) { int cnt = prefa[rt][t]; if(lt > 0)cnt -= prefa[lt-1][t]; return cnt; } int getb(int lt, int rt, int t) { int cnt = prefb[rt][t]; if(lt > 0)cnt -= prefb[lt-1][t]; return cnt; } int cnt[6]; int get_distance(int x, int y) { for (int j = 0; j < 3; ++ j) { if(geta(x, y, j) != getb(x, y, j))return -1; } int ok = cool[y]; if(x)ok -= cool[x-1]; int lft = y - x + 1 - ok; int dvoiki = 0; for (int j = 0; j < 6; ++ j) { cnt[j] = 0; cnt[j] = pref[y][j]; if(x)cnt[j] -= pref[x-1][j]; } for (int j = 0; j < 3; ++ j) dvoiki += min(cnt[j], cnt[5-j]); int real_left = lft - dvoiki * 2; return max(0, max(0, real_left/3 * 2) + dvoiki); }
#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...