This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include <iostream>
#include <vector>
struct Count {
int at, ca, tc;
int qw;
Count() : at(0), ca(0), tc(0), qw(0) {}
inline Count operator+(const Count &rhs) const {
Count res = *this;
res += rhs;
return res;
}
inline void operator+=(const Count &rhs) {
at += rhs.at;
ca += rhs.ca;
tc += rhs.tc;
qw += rhs.qw;
}
inline Count operator-(const Count &rhs) const {
Count res = *this;
res -= rhs;
return res;
}
inline void operator-=(const Count &rhs) {
at -= rhs.at;
ca -= rhs.ca;
tc -= rhs.tc;
qw -= rhs.qw;
}
};
std::string a, b;
std::vector<Count> prefixes;
void init(std::string A, std::string B) {
a = A;
b = B;
prefixes.reserve(A.size() + 1);
prefixes.push_back(Count{});
Count count;
for (int i = 0; i < A.size(); i++) {
if (A[i] == 'A' && B[i] == 'T') count.at += 1;
if (A[i] == 'T' && B[i] == 'A') count.at -= 1;
if (A[i] == 'C' && B[i] == 'A') count.ca += 1;
if (A[i] == 'A' && B[i] == 'C') count.ca -= 1;
if (A[i] == 'T' && B[i] == 'C') count.tc += 1;
if (A[i] == 'C' && B[i] == 'T') count.tc -= 1;
if (A[i] != B[i]) count.qw += 1;
prefixes.push_back(count);
}
}
int get_distance(int x, int y) {
y += 1;
Count count = prefixes[y] - prefixes[x];
// a1 = aa + at + ac
// a2 = aa + ta + ca
// a1 == a2
// at + ac == ta + ca
// (at - ta) + (ac - ca) == 0
// (at - ta) == (ca - ac)
// t1 = tt + ta + tc
// t2 = tt + at + ct
// t1 == t2
// (ta - at) + (tc - ct) == 0
// (tc - ct) == (at - ta)
// c1 = cc + ca + ct
// c2 = cc + ac + tc
// c1 == c2
// (ca - ac) + (ct - tc) == 0
// (ca - ac) == (tc - ct)
// (at - ta) == (ca - ac) == (tc - ct)
// if (count.a1 != count.a2 || count.t1 != count.t2 || count.c1 != count.c2) {
// return -1;
// }
if (!(count.at == count.ca && count.ca == count.tc)) return -1;
// std::cout << count.at << ' ' << count.ta << ' ' << count.ac << ' ' << count.ca << ' ' << count.tc << ' ' << count.ct << '\n';
// int at_pairs = std::min(count.at, count.ta);
// int ac_pairs = std::min(count.ac, count.ca);
// int tc_pairs = std::min(count.tc, count.ct);
// int total = at_pairs + ac_pairs + tc_pairs;
// count.at -= at_pairs;
// count.ta -= at_pairs;
// count.ac -= ac_pairs;
// count.ca -= ac_pairs;
// count.tc -= tc_pairs;
// count.ct -= tc_pairs;
// std::cout << count.at << ' ' << count.ta << ' ' << count.ac << ' ' << count.ca << ' ' << count.tc << ' ' << count.ct << '\n';
// return total + std::max(count.at, count.ta) * 2;
// qw = at + ta + ac + ca + tc + ct
// (at + ta) - abs(at - ta)
int total =
count.qw - std::abs(count.at) - std::abs(count.tc) - std::abs(count.ca);
total /= 2;
return total + std::abs(count.at) * 2;
}
Compilation message (stderr)
dna.cpp: In function 'void init(std::string, std::string)':
dna.cpp:47:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::__cxx11::basic_string<char>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
47 | for (int i = 0; i < A.size(); i++) {
| ~~^~~~~~~~~~
# | 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... |