제출 #1253026

#제출 시각아이디문제언어결과실행 시간메모리
1253026antonnDNA 돌연변이 (IOI21_dna)C++20
100 / 100
27 ms8964 KiB
#include<bits/stdc++.h>

using namespace std;

typedef long long ll;

template<typename T>
bool assign_min(T& a, T b) {
    if (a > b) {
        a = b;
        return true;
    }
    return false;
}

template<typename T>
bool assign_max(T& a, T b) {
    if (a < b) {
        a = b;
        return true;
    }
    return false;
}

const int N = 1e5 + 7;

vector<int> prefAA, prefAT, prefAC;
vector<int> prefBA, prefBT, prefBC;
int pref[N][3][3];
vector<int> pr;

int code(char c) {
    if (c == 'A') {
        return 0;
    }
    if (c == 'T') {
        return 1;
    }
    if (c == 'C') {
        return 2;
    }
}

void init(string a, string b) {
    int n = a.size();
    prefAA.resize(n + 1);
    prefAT.resize(n + 1);
    prefAC.resize(n + 1);
    for (int i = 1; i <= a.size(); i++) {
        prefAA[i] = prefAA[i - 1] + (a[i - 1] == 'A');
        prefAT[i] = prefAT[i - 1] + (a[i - 1] == 'T');
        prefAC[i] = prefAC[i - 1] + (a[i - 1] == 'C');
    }
    prefBA.resize(n + 1);
    prefBT.resize(n + 1);
    prefBC.resize(n + 1);
    for (int i = 1; i <= b.size(); i++) {
        prefBA[i] = prefBA[i - 1] + (b[i - 1] == 'A');
        prefBT[i] = prefBT[i - 1] + (b[i - 1] == 'T');
        prefBC[i] = prefBC[i - 1] + (b[i - 1] == 'C');
    }
    pr.resize(n + 1);
    for (int i = 1; i <= n; i++) {
        pr[i] = pr[i - 1] + (a[i - 1] != b[i - 1]);
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 0; j < 3; j++) {
            for (int k = 0; k < 3; k++) {
                pref[i][j][k] = pref[i - 1][j][k];
                if (code(a[i - 1]) == j && code(b[i - 1]) == k) {
                    pref[i][j][k]++;
                }
            }
        }
    }
}

int get_distance(int x, int y) {
    x++;
    y++;
    if (prefAA[y] - prefAA[x - 1] != prefBA[y] - prefBA[x - 1]) {
        return -1;
    }
    if (prefAT[y] - prefAT[x - 1] != prefBT[y] - prefBT[x - 1]) {
        return -1;
    }
    if (prefAC[y] - prefAC[x - 1] != prefBC[y] - prefBC[x - 1]) {
        return -1;
    }
    int ans = 0;
    
    int X = min(pref[y][0][1] - pref[x - 1][0][1], pref[y][1][0] - pref[x - 1][1][0]);
    int Y = min(pref[y][0][2] - pref[x - 1][0][2], pref[y][2][0] - pref[x - 1][2][0]);
    int Z = min(pref[y][1][2] - pref[x - 1][1][2], pref[y][2][1] - pref[x - 1][2][1]);
    ans += X + Y + Z;
    int ra = prefAA[y] - prefAA[x - 1] - X - Y - (pref[y][0][0] - pref[x - 1][0][0]);
    int rt = prefAT[y] - prefAT[x - 1] - X - Z - (pref[y][1][1] - pref[x - 1][1][1]);
    int rc = prefAC[y] - prefAC[x - 1] - Y - Z - (pref[y][2][2] - pref[x - 1][2][2]);
    ll m = min(ra, min(rt, rc));
    ans += m * 2;
    ra -= m;
    rt -= m;
    rc -= m;
    ans += max(0, max(ra, max(rt, rc)) - 1);
    return ans;
}

컴파일 시 표준 에러 (stderr) 메시지

dna.cpp: In function 'int code(char)':
dna.cpp:42:1: warning: control reaches end of non-void function [-Wreturn-type]
   42 | }
      | ^
#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...