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<bits/stdc++.h>
#include<iostream>
#include<stdlib.h>
#include<cmath>
#include <algorithm>
#include<numeric>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<pair<int, int> > vpii;
typedef pair<ll, ll> pll;
typedef vector<pll> vpll;
typedef vector<ll> vll;
#define FOR(i,a,b) for (int i = (a); i < (b); ++i)
#define trav(a,x) for (auto& a: x)
#define fr(i, a, b, s) for (int i=(a); (s)>0?i<(b):i>=(b); i+=(s))
#define fr1(e) fr(i, 0, e, 1)
#define fr2(i, e) fr(i, 0, e, 1)
#define fr3(i, b, e) fr(i, b, e, 1)
#define mp make_pair
#define pb push_back
#define sz(x) int(x.size())
#define all(x) begin(x), end(x)
#define rall(x) rbegin(x), rend(x)
#define in insert
#define yes cout<<"YES\n"
#define no cout<<"NO\n"
int dx[4] = { -1, 0, 1, 0 };
int dy[4] = { 0, 1, 0, -1 };
const int mod = 1e9 + 7;
void xd(string str)
{
ios_base::sync_with_stdio(0); cin.tie(0);
if (str != "")
{
//freopen((str + ".in").c_str(), "r", stdin);
//freopen((str + ".out").c_str(), "w", stdout);
}
}
int add(int a, int b, int mod = 1e9 + 7) { return (((a % mod) + (b % mod)) + mod) % mod; }
int sub(int a, int b, int mod = 1e9 + 7) { return (((a % mod) - (b % mod)) + mod) % mod; }
int mul(int a, int b, int mod = 1e9 + 7) { return (((a % mod) * (b % mod)) + mod) % mod; }
int bin(int a, int b, int mod = 1e9 + 7) { int ans = 1; while (b) { if (b & 1) ans = mul(ans, a, mod); a = mul(a, a, mod); b >>= 1; }return ans; }
int inverse(int a, int mod = 1e9 + 7) { return bin(a, mod - 2, mod); }
int divi(int a, int b, int mod = 1e9 + 7) {
return mul(a, inverse(b, mod), mod);
}
ll add(ll a, ll b, ll mod = 1e9 + 7) { return (((a % mod) + (b % mod)) + mod) % mod; }
ll sub(ll a, ll b, ll mod = 1e9 + 7) { return (((a % mod) - (b % mod)) + mod) % mod; }
ll mul(ll a, ll b, ll mod = 1e9 + 7) { return (((a % mod) * (b % mod)) + mod) % mod; }
ll bin(ll a, ll b, ll mod = 1e9 + 7) { ll ans = 1; while (b) { if (b & 1) ans = mul(ans, a, mod); a = mul(a, a, mod); b >>= 1; }return ans; }
ll inverse(ll a, ll mod = 1e9 + 7) { return bin(a, mod - 2, mod); }
ll divi(ll a, ll b, ll mod = 1e9 + 7) {
return mul(a, inverse(b, mod), mod);
}
ll ex(int base, int power)
{
if (power == 0)
return 1;
ll result = ex(base, power / 2);
if (power % 2 == 1)
return(((result * result) % mod) * base) % mod;
else return (result * result) % mod;
}
int gcd(int a, int b) {
if (b == 0)return a;
else return gcd(b, a % b);
}
int lcm(int a, int b) {
return a * b / gcd(a, b);
}
ll fac(int x) {
ll factorial = 1;
for (ll i = 1; i <= x; ++i) {
factorial = mul(factorial, i);
}
return factorial % mod;
}
ll npr(int x, int c) {
if (x == c) return fac(x);
else return (fac(x) / (fac(x - c) * fac(c))) % mod;
}
void bton(string s) { stoll(s, nullptr, 2); }
inline int read() {
int x = 0, f = 1, c = getchar();
while (!isdigit(c)) { if (c == '-')f = -1; c = getchar(); }
while (isdigit(c)) { x = (x << 1) + (x << 3) + (c ^ 48); c = getchar(); }
return f == 1 ? x : -x;
}
bool isPrime(int n)
{
if (n == 2 || n == 3)
return true;
if (n <= 1 || n % 2 == 0 || n % 3 == 0)
return false;
for (int i = 5; i * i <= n; i += 6) {
if (n % i == 0 || n % (i + 2) == 0)
return false;
}
return true;
}
int ceil_int(int first_number, int divider) {
if (first_number % divider == 0) return first_number / divider;
else return first_number / divider + 1;
}
ll ceil_ll(ll first_number, ll divider) {
if (first_number % divider == 0) return first_number / divider;
else return first_number / divider + 1LL;
}
#include "dna.h"
string aa, bb;
int n;
vi preaA, preaT, prebA,prebT,diff,diffa,difft;
void init(std::string a, std::string b) {
n = sz(a);
aa = a;
bb = b;
preaA.resize(n); preaT.resize(n);
prebA.resize(n); prebT.resize(n);
diff.resize(n); diffa.resize(n);difft.resize(n);
preaA[0] = (aa[0] == 'A' ? 1 : 0);
preaT[0] = (aa[0] == 'T' ? 1 : 0);
prebA[0] = (bb[0] == 'A' ? 1 : 0);
prebT[0] = (bb[0] == 'T' ? 1 : 0);
diff[0] = (aa[0] != bb[0] ? 1 : 0);
if (aa[0] != bb[0]) {
diffa[0] = 0, difft[0] = 0;
if (aa[0] == 'A')diffa[0] = 1;
if (aa[0] == 'T')difft[0] = 1;
}
FOR(i, 1, n) {
preaA[i]=preaA[i-1]+ (aa[i] == 'A' ? 1 : 0);
preaT[i] = preaT[i - 1] + (aa[i] == 'T' ? 1 : 0);
prebA[i] = prebA[i - 1] + (bb[i] == 'A' ? 1 : 0);
prebT[i] = prebT[i - 1] + (bb[i] == 'T' ? 1 : 0);
diff[i] = diff[i - 1] + (aa[i] != bb[i] ? 1 : 0);
if (aa[i] != bb[i]) {
if (aa[i] == 'A')diffa[i] = diffa[i - 1] + 1;
if (aa[i] == 'T')difft[i] = difft[i - 1] + 1;
}
}
}
int get_distance(int x, int y) {
if (y - x == 0) {
if (aa[x] != bb[x]) return -1;
return 0;
}
else if (y - x == 1) {
if (aa[x] == bb[x] && aa[y] == bb[y]) return 0;
else if (aa[x] == bb[y] && aa[y] == bb[x]) return 1;
return -1;
}
else if (y - x == 2) {
map<char, int> m1;
FOR(i, x, y + 1) m1[aa[i]]++;
map<char, int>m2;
FOR(i, x, y + 1) m2[bb[i]]++;
string p = "ATC";
int ok1 = 0;
FOR(i, 0, sz(p)) {
if (m1[p[i]] != m2[p[i]]) ok1 = 1;
}
if (ok1) return -1;
int ok = 1,cnt=0;
FOR(i, x, y + 1) {
if (aa[i] != bb[i]) {
ok = 0; cnt++;
}
}
if (ok) return 0;
else {
return cnt - 1;
}
}
else {
if (x == 0) {
ll Aa =preaA[y], Ta =preaT[y],Ca=(y+1)-Aa-Ta;
int Ab = prebA[y], Tb = prebT[y], Cb = (y+1) - Ab - Tb;
if (Aa != Ab || Ta != Tb || Ca!=Cb || diff[y]%2==1) return -1;
else {
int da = diffa[y], dt = difft[y], dc = diff[y] - da - dt;
return diff[y] / 2;
}
}
else {
int Aa = preaA[y]-preaA[x-1], Ta = preaT[y] - preaT[x - 1], Ca = (y - x + 1) - Aa - Ta;
int Ab = prebA[y] - prebA[x - 1], Tb = prebT[y]-prebT[x-1], Cb = (y - x + 1) - Ab - Tb;
if (Aa != Ab || Ta != Tb || Ca != Cb ||(diff[y] - diff[x - 1]) % 2 == 1) return -1;
else {
int da = diffa[y]-diffa[x-1], dt = difft[y]-difft[x-1], dc = diff[y]-diff[x-1] - da - dt;
if (da == dt && dt == dc) return dt * 2;
return (diff[y]-diff[x-1]) / 2;
}
}
}
}
Compilation message (stderr)
dna.cpp: In function 'int get_distance(int, int)':
dna.cpp:187:39: warning: unused variable 'dc' [-Wunused-variable]
187 | int da = diffa[y], dt = difft[y], dc = diff[y] - da - dt;
| ^~
# | 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... |