#include "dna.h"
#include <bits/stdc++.h>
using namespace std;
using vi = vector<int>;
const int MAXN = 100'001;
int n;
string A, B;
int prefixA[3][MAXN];
int prefixB[3][MAXN];
int prefixDiff[6][MAXN]; // pd[0]: A, T, pd[1]: A, C, pd[2]: T, A, pd[3]: T, C, pd[4]: C, A, pd[5]: C, T
int gi(char inp) {
if (inp == 'A') return 0;
else if (inp == 'T') return 1;
else return 2;
}
char g(int i) {
if (i == 0) return 'A';
else if (i == 1) return 'T';
else return 'G';
}
int p(int i, int j) {
if (i == 0 && j == 1) return 0;
else if (i == 0 && j == 2) return 1;
else if (i == 1 && j == 0) return 2;
else if (i == 1 && j == 2) return 3;
else if (i == 2 && j == 1) return 4;
else return 5;
}
void init(string a, string b) {
A = a;
B = b;
n = (int) a.size();
for (int i = 0; i < n; i++) {
for (int j = 0; j < 3; j++) {
prefixA[j][i + 1] = prefixA[j][i];
prefixB[j][i + 1] = prefixB[j][i];
}
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 3; k++) {
if (j == k) continue;
int is_diff = (a[i] == g(j) && b[i] == g(k)) ? 1 : 0;
prefixDiff[p(j, k)][i+1] = prefixDiff[p(j, k)][i] + is_diff;
}
}
prefixA[gi(a[i])][i+1]++;
prefixB[gi(b[i])][i+1]++;
}
}
int get_distance(int x, int y) {
for (int j = 0; j < 3; j++) {
int cntA = prefixA[j][y + 1] - prefixA[j][x];
int cntB = prefixB[j][y + 1] - prefixB[j][x];
if (cntA != cntB) return -1;
}
return prefixDiff[p(0, 1)][y + 1] - prefixDiff[p(0, 1)][x];
}
# | 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... |