Submission #1369589

#TimeUsernameProblemLanguageResultExecution timeMemory
1369589aleksandreDNA 돌연변이 (IOI21_dna)C++20
100 / 100
22 ms6172 KiB
#include <bits/stdc++.h>
#include "dna.h"
using namespace std;
static int p[100005][6];
static int c[100005][3];
void init(std::string a, std::string b) {
	int n = a.size();
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 6; j++) p[i + 1][j] = p[i][j];
        for (int j = 0; j < 3; j++) c[i + 1][j] = c[i][j];
        if (a[i] == 'A') c[i + 1][0]++;
        if (b[i] == 'A') c[i + 1][0]--;
        if (a[i] == 'C') c[i + 1][1]++;
        if (b[i] == 'C') c[i + 1][1]--;
        if (a[i] == 'T') c[i + 1][2]++;
        if (b[i] == 'T') c[i + 1][2]--;
        if (a[i] != b[i]) {
            if (a[i] == 'A' && b[i] == 'T') p[i + 1][0]++;
            else if (a[i] == 'A' && b[i] == 'C') p[i + 1][1]++;
            else if (a[i] == 'C' && b[i] == 'T') p[i + 1][2]++;
            else if (a[i] == 'T' && b[i] == 'C') p[i + 1][3]++;
            else if (a[i] == 'C' && b[i] == 'A') p[i + 1][4]++;
            else if (a[i] == 'T' && b[i] == 'A') p[i + 1][5]++;
        }
    }
}
int get_distance(int x, int y) {
	if ((c[y + 1][0] - c[x][0]) != 0 || (c[y + 1][1] - c[x][1]) != 0 || (c[y + 1][2] - c[x][2]) != 0) return -1;
    int v[6];
    for (int i = 0; i < 6; i++) v[i] = p[y + 1][i] - p[x][i];
    int res = 0;
    int m0 = min(v[0], v[5]), m1 = min(v[1], v[4]), m2 = min(v[2], v[3]);
    res += m0 + m1 + m2;
    v[0] -= m0; v[5] -= m0;
    v[1] -= m1; v[4] -= m1;
    v[2] -= m2; v[3] -= m2;
    int rem = 0;
    for (int i = 0; i < 6; i++) rem += v[i];
    return res + (rem / 3) * 2;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...