이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <dna.h>
#include <bits/stdc++.h>
using namespace std;
vector <int> posa, posb;
const int N = 500500;
vector <int> pref(N);
int values[2][2][N];
void init(string a, string b)
{
    int n = a.size();
    for (int i = 0; i < n; ++i) {
        if (a[i] == 'A') {
            posa.push_back(0);
        }
        else if (a[i] == 'T') {
            posa.push_back(1);
        }
        else if (a[i] == 'C') {
            posa.push_back(2);
        }
        if (b[i] == 'A') {
            posb.push_back(0);
        }
        else if (b[i] == 'T') {
            posb.push_back(1);
        }
        else if (b[i] == 'C') {
            posb.push_back(2);
        }
    }
    int cur = 0;
    for (int i = 0; i < n; ++i) {
        if (posa[i] != posb[i]) {
            cur++;
            pref[i] = cur;
        }
        else {
            if (i == 0) {
                pref[i] = 0;
            }
            else {
                pref[i] = pref[i - 1];
            }
        }
    }
    int cnta = 0, cntt = 0;
    for (int i = 0; i < n; ++i) {
        if (posa[i] == 0) {
            cnta++;
            values[0][0][i] = cnta;
            if (i > 0) {
                values[0][1][i] = values[0][1][i - 1];
            }
        }
        else if (posa[i] == 1) {
            cntt++;
            values[0][1][i] = cntt;
            if (i > 0) {
                values[0][0][i] = values[0][0][i - 1];
            }
        }
    }
    cnta = 0, cntt = 0;
    for (int i = 0; i < n; ++i) {
        if (posb[i] == 0) {
            cnta++;
            values[1][0][i] = cnta;
            if (i > 0) {
                values[1][1][i] = values[1][1][i - 1];
            }
        }
        else if (posb[i] == 1) {
            cntt++;
            values[1][1][i] = cntt;
            if (i > 0) {
                values[1][0][i] = values[1][0][i - 1];
            }
        }
    }
}
int get_distance(int x, int y)
{
    if (y - x == 2) {
        bool ok = true;
        for (int i = x; i <= y; ++i) {
            if (posa[i] != posb[i]) {
                ok = false;
                break;
            }
        }
        if (ok) {
            return 0;
        }
        int cnta = 0, cntt = 0, cntc = 0;
        for (int i = x; i <= y; ++i) {
            if (posa[i] == 0) {
                cnta++;
            }
            else if (posa[i] == 1) {
                cntt++;
            }
            else {
                cntc++;
            }
        }
        for (int i = x; i <= y; ++i) {
            if (posb[i] == 0) {
                cnta--;
            }
            else if (posb[i] == 1) {
                cntt--;
            }
            else {
                cntc--;
            }
        }
        if (cnta != 0 or cntt != 0 or cntc != 0) {
            return -1;
        }
        ok = false;
        for (int i = x; i <= y; ++i) {
            if (posa[i] == posb[i]) {
                ok = true;
                break;
            }
        }
        if (ok) {
            return 1;
        }
        else {
            return 2;
        }
    }
    else if (y - x == 1) {
        if (posa[x] == posb[x] and posa[y] == posb[y]) {
            return 0;
        }
        else if (posa[x] == posb[y] and posb[x] == posa[y]) {
            return 1;
        }
        else {
            return -1;
        }
    }
    else if (y - x == 0) {
        if (posa[x] == posb[x]) {
            return 0;
        }
        else {
            return -1;
        }
    }
    else {
        int cnta = 0, cntt = 0;
        if (x == 0) {
            cnta = values[0][0][y] - values[1][0][y];
            cntt = values[0][1][y] - values[1][1][y];
        }
        else {
            cnta = values[0][0][y] - values[0][0][x - 1] - values[1][0][y] + values[1][0][x - 1];
            cntt = values[0][1][y] - values[0][1][x - 1] - values[1][1][y] + values[1][1][x - 1];
        }
        if (cnta != 0 or cntt != 0) {
            return -1;
        }
        int cnt = 0;
        if (x == 0) {
            cnt = pref[y];
        }
        else {
            cnt = pref[y] - pref[x - 1];
        }
        int res = (cnt + 1) / 2;
        return res;
    }
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |