제출 #1195739

#제출 시각아이디문제언어결과실행 시간메모리
1195739NonozeMutating DNA (IOI21_dna)C++20
100 / 100
99 ms33868 KiB
#include "dna.h" #include <bits/stdc++.h> using namespace std; int is(char c) { if (c=='A') return 0; else if (c=='C') return 1; return 2; } int n; vector<vector<int>> prefa, prefb; vector<vector<vector<int>>> diffs; vector<int> diff; string a, b; void init(string A, string B) { a=A, b=B; n=(int)a.size(); prefa.push_back({0, 0, 0}), prefb.push_back({0, 0, 0}), diff.push_back(0), diffs.push_back({{0, 0, 0}, {0, 0, 0}, {0, 0, 0}}); for (int i=0; i<n; i++) { prefa.push_back(prefa.back()), prefb.push_back(prefb.back()), diff.push_back(diff.back()), diffs.push_back(diffs.back()); prefa.back()[is(a[i])]++, prefb.back()[is(b[i])]++, diff.back()+=a[i]!=b[i], diffs.back()[is(a[i])][is(b[i])]++; } } int get_distance(int x, int y) { if (prefa[y+1][0]-prefa[x][0]!=prefb[y+1][0]-prefb[x][0] || prefa[y+1][1]-prefa[x][1]!=prefb[y+1][1]-prefb[x][1] || prefa[y+1][2]-prefa[x][2]!=prefb[y+1][2]-prefb[x][2]) return -1; vector<vector<int>> act={ {diffs[y+1][0][0]-diffs[x][0][0], diffs[y+1][0][1]-diffs[x][0][1], diffs[y+1][0][2]-diffs[x][0][2]}, {diffs[y+1][1][0]-diffs[x][1][0], diffs[y+1][1][1]-diffs[x][1][1], diffs[y+1][1][2]-diffs[x][1][2]}, {diffs[y+1][2][0]-diffs[x][2][0], diffs[y+1][2][1]-diffs[x][2][1], diffs[y+1][2][2]-diffs[x][2][2]} }; int ans=min(act[0][1], act[1][0])+min(act[0][2], act[2][0])+min(act[1][2], act[2][1]); assert(abs(act[0][1]-act[1][0])==abs(act[0][2]-act[2][0]) && abs(act[0][1]-act[1][0])==abs(act[1][2]-act[2][1])); return ans+abs(act[0][1]-act[1][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...