제출 #1275771

#제출 시각아이디문제언어결과실행 시간메모리
1275771nhamtanDNA 돌연변이 (IOI21_dna)C++20
56 / 100
32 ms9708 KiB
#include "dna.h" #include <bits/stdc++.h> using namespace std; const int N = 1e5 + 5; char c[] = {'A', 'C', 'T'}; int n; int pre[N][3][3], preTwo[N][3][3], cnt[3][3], dem[3][3]; void init(string A, string B) { n = A.size(); for (int i = 1; i <= n; i++) { for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) { pre[i][j][k] = pre[i-1][j][k] + (A[i-1] != B[i-1] && A[i-1] == c[j] && B[i-1] == c[k]); preTwo[i][j][k] = preTwo[i-1][j][k] + (A[i-1] != B[i-1] && B[i-1] == c[j] && A[i-1] == c[k]); } } } int get_distance(int x, int y) { x++; y++; for (int j = 0; j < 3; j++) { for (int k = 0; k < 3; k++) { cnt[j][k] = pre[y][j][k] - pre[x-1][j][k]; dem[j][k] = preTwo[y][j][k] - preTwo[x-1][j][k]; } if (cnt[j][0] + cnt[j][1] + cnt[j][2] != dem[j][0] + dem[j][1] + dem[j][2]) return -1; } int ans = 0; // đổi chéo trực tiếp for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) { int temp = min(cnt[j][k], cnt[k][j]); cnt[j][k] -= temp; cnt[k][j] -= temp; ans += temp; } bool ok = false; for (int j = 0; j < 3; j++) for (int k = 0; k < 3; k++) { ans += cnt[j][k]; if (cnt[j][k]) ok = true; } ans -= ok; // trừ đi 1 nếu có chu trình 3 ký tự 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...