#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <map>
#include <numeric>
#include <algorithm>
using namespace std;
typedef vector<vector<int>> int33;
map<char, int> get_index;
map<int, char> get_char;
int n;
vector<pair<int, int>> segtree_span;
vector<int33> segtree;
vector<char> origin;
vector<char> mutated;
int33 calculate_crossmultiply(int index) {
int33 result{{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
result[get_index[origin[index]]][get_index[mutated[index]]] = 1;
return result;
}
int33 combine(int33 a, int33 b) {
int33 result{{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
result[i][j] = a[i][j] + b[i][j];
}
}
return result;
}
void build(int x, int l, int r) {
segtree_span[x] = make_pair(l, r);
if (l == r) {
segtree[x] = calculate_crossmultiply(l);
return;
}
int mid = (l + r) / 2;
build(2 * x, l, mid);
build(2 * x + 1, mid + 1, r);
segtree[x] = combine(segtree[2 * x], segtree[2 * x + 1]);
}
int33 query(int x, int l, int r) {
if ((segtree_span[x].first > r) || (segtree_span[x].second < l)) {
int33 result{{0, 0, 0}, {0, 0, 0}, {0, 0, 0}};
return result;
}
if ((segtree_span[x].first >= l) && (segtree_span[x].second <= r)) {
return segtree[x];
}
return combine(query(2 * x, l, r), query(2 * x + 1, l, r));
}
void init(string a, string b) {
// initialize maps between amino acids and indices
get_index['A'] = 0; get_index['C'] = 1; get_index['T'] = 2;
get_char[0] = 'A'; get_char[1] = 'C'; get_char[2] = 'T';
// take in the data
n = a.size();
origin.resize(n);
mutated.resize(n);
for (int i = 0; i < n; i++) {
origin[i] = a[i];
mutated[i] = b[i];
}
// construct the segment tree
segtree_span.resize(4 * n);
segtree.resize(4 * n);
build(1, 0, n - 1);
}
int get_distance(int x, int y) {
int33 cross = query(1, x, y);
int distance = 0;
int result;
// check if it is possible to begin with:
bool possible = true;
for (int i = 0; i < 3; i++) {
possible &= (cross[i][0] + cross[i][1] + cross[i][2] == cross[0][i] + cross[1][i] + cross[2][i]);
}
if (!possible) {
return -1;
}
// go into all cases ig:
// (a, b) - (b, a) --> (a, a) - (b, b)
for (int i = 0; i < 3; i++) {
for (int j = 0; j < i; j++) {
result = min<int>(cross[i][j], cross[j][i]);
distance += result;
cross[i][j] -= result;
cross[j][i] -= result;
}
}
// (a, b) - (b, c) - (c, a) --> (a, a) - (b, b) - (c, c) in 2 moves
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
for (int k = 0; k < 3; k++) {
if ((i != j) && (j != k) && (k != i)) {
result = min<int>(cross[i][j], min<int>(cross[j][k], cross[k][i]));
distance += 2 * result;
cross[i][j] -= result;
cross[j][k] -= result;
cross[k][i] -= result;
}
}
}
}
return distance;
}
/*
int main() {
return 0;
}
*/
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
831 ms |
50092 KB |
Output is correct |
2 |
Correct |
869 ms |
50692 KB |
Output is correct |
3 |
Correct |
856 ms |
46464 KB |
Output is correct |
4 |
Correct |
906 ms |
50696 KB |
Output is correct |
5 |
Correct |
1 ms |
304 KB |
Output is correct |
6 |
Correct |
1 ms |
212 KB |
Output is correct |
7 |
Correct |
0 ms |
212 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
137 ms |
47656 KB |
Output is correct |
5 |
Correct |
116 ms |
48256 KB |
Output is correct |
6 |
Correct |
117 ms |
47920 KB |
Output is correct |
7 |
Correct |
118 ms |
44876 KB |
Output is correct |
8 |
Correct |
131 ms |
48192 KB |
Output is correct |
9 |
Correct |
117 ms |
48144 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
137 ms |
47656 KB |
Output is correct |
5 |
Correct |
116 ms |
48256 KB |
Output is correct |
6 |
Correct |
117 ms |
47920 KB |
Output is correct |
7 |
Correct |
118 ms |
44876 KB |
Output is correct |
8 |
Correct |
131 ms |
48192 KB |
Output is correct |
9 |
Correct |
117 ms |
48144 KB |
Output is correct |
10 |
Correct |
957 ms |
50104 KB |
Output is correct |
11 |
Correct |
836 ms |
50692 KB |
Output is correct |
12 |
Correct |
1350 ms |
47756 KB |
Output is correct |
13 |
Correct |
1352 ms |
48936 KB |
Output is correct |
14 |
Correct |
1332 ms |
51100 KB |
Output is correct |
15 |
Correct |
1395 ms |
50944 KB |
Output is correct |
16 |
Correct |
1222 ms |
47800 KB |
Output is correct |
17 |
Correct |
1201 ms |
48856 KB |
Output is correct |
18 |
Correct |
1211 ms |
50984 KB |
Output is correct |
19 |
Correct |
1128 ms |
47656 KB |
Output is correct |
20 |
Correct |
1126 ms |
48836 KB |
Output is correct |
21 |
Correct |
1134 ms |
50964 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1 ms |
212 KB |
Output is correct |
2 |
Correct |
1 ms |
212 KB |
Output is correct |
3 |
Correct |
1 ms |
212 KB |
Output is correct |
4 |
Correct |
137 ms |
47656 KB |
Output is correct |
5 |
Correct |
116 ms |
48256 KB |
Output is correct |
6 |
Correct |
117 ms |
47920 KB |
Output is correct |
7 |
Correct |
118 ms |
44876 KB |
Output is correct |
8 |
Correct |
131 ms |
48192 KB |
Output is correct |
9 |
Correct |
117 ms |
48144 KB |
Output is correct |
10 |
Correct |
116 ms |
44168 KB |
Output is correct |
11 |
Correct |
113 ms |
48200 KB |
Output is correct |
12 |
Correct |
106 ms |
45040 KB |
Output is correct |
13 |
Correct |
114 ms |
47824 KB |
Output is correct |
14 |
Correct |
114 ms |
48248 KB |
Output is correct |
15 |
Correct |
112 ms |
48160 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
831 ms |
50092 KB |
Output is correct |
2 |
Correct |
869 ms |
50692 KB |
Output is correct |
3 |
Correct |
856 ms |
46464 KB |
Output is correct |
4 |
Correct |
906 ms |
50696 KB |
Output is correct |
5 |
Correct |
1 ms |
304 KB |
Output is correct |
6 |
Correct |
1 ms |
212 KB |
Output is correct |
7 |
Correct |
0 ms |
212 KB |
Output is correct |
8 |
Correct |
1 ms |
212 KB |
Output is correct |
9 |
Correct |
1 ms |
212 KB |
Output is correct |
10 |
Correct |
1 ms |
212 KB |
Output is correct |
11 |
Correct |
137 ms |
47656 KB |
Output is correct |
12 |
Correct |
116 ms |
48256 KB |
Output is correct |
13 |
Correct |
117 ms |
47920 KB |
Output is correct |
14 |
Correct |
118 ms |
44876 KB |
Output is correct |
15 |
Correct |
131 ms |
48192 KB |
Output is correct |
16 |
Correct |
117 ms |
48144 KB |
Output is correct |
17 |
Correct |
957 ms |
50104 KB |
Output is correct |
18 |
Correct |
836 ms |
50692 KB |
Output is correct |
19 |
Correct |
1350 ms |
47756 KB |
Output is correct |
20 |
Correct |
1352 ms |
48936 KB |
Output is correct |
21 |
Correct |
1332 ms |
51100 KB |
Output is correct |
22 |
Correct |
1395 ms |
50944 KB |
Output is correct |
23 |
Correct |
1222 ms |
47800 KB |
Output is correct |
24 |
Correct |
1201 ms |
48856 KB |
Output is correct |
25 |
Correct |
1211 ms |
50984 KB |
Output is correct |
26 |
Correct |
1128 ms |
47656 KB |
Output is correct |
27 |
Correct |
1126 ms |
48836 KB |
Output is correct |
28 |
Correct |
1134 ms |
50964 KB |
Output is correct |
29 |
Correct |
116 ms |
44168 KB |
Output is correct |
30 |
Correct |
113 ms |
48200 KB |
Output is correct |
31 |
Correct |
106 ms |
45040 KB |
Output is correct |
32 |
Correct |
114 ms |
47824 KB |
Output is correct |
33 |
Correct |
114 ms |
48248 KB |
Output is correct |
34 |
Correct |
112 ms |
48160 KB |
Output is correct |
35 |
Correct |
1 ms |
212 KB |
Output is correct |
36 |
Correct |
772 ms |
46460 KB |
Output is correct |
37 |
Correct |
799 ms |
50692 KB |
Output is correct |
38 |
Correct |
1286 ms |
48152 KB |
Output is correct |
39 |
Correct |
1336 ms |
51076 KB |
Output is correct |
40 |
Correct |
1293 ms |
51148 KB |
Output is correct |
41 |
Correct |
109 ms |
48264 KB |
Output is correct |
42 |
Correct |
1191 ms |
48120 KB |
Output is correct |
43 |
Correct |
1209 ms |
50968 KB |
Output is correct |
44 |
Correct |
1235 ms |
50992 KB |
Output is correct |
45 |
Correct |
1113 ms |
48028 KB |
Output is correct |
46 |
Correct |
1114 ms |
50968 KB |
Output is correct |
47 |
Correct |
1131 ms |
50972 KB |
Output is correct |