#include "dna.h"
//#include "grader.cpp"
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#pragma GCC target("avx,avx2,fma")
#pragma GCC optimize("Ofast,unroll-loops")
using namespace std;
using namespace __gnu_pbds;
#define pb      push_back
#define all(x)  x.begin(),x.end()
#define ar      array
#define mrand(a, b)   uniform_int_distribution<int>(a, b)(rng)
template<class T>bool umax(T &a,T b){if(a<b){a=b;return true;}return false;}
template<class T>bool umin(T &a,T b){if(b<a){a=b;return true;}return false;}
template<class T> using ste = tree<T, null_type, less_equal<T>,
rb_tree_tag, tree_order_statistics_node_update>;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
namespace FAST {
    template<typename T, typename F>
    istream &operator>>(istream &cin, pair<T, F> &p) {
        cin >> p.first >> p.second;
        return cin;
    }
    template<typename T, typename F>
    ostream &operator<<(ostream &cout, pair<T, F> &p) {
        cout << p.first << ' ' << p.second;
        return cout;
    }
    template<typename T>
    istream &operator>>(istream &cin, vector<T> &a) {
    for (T &i: a) cin >> i;
        return cin;
    }
    template<typename T>
    ostream &operator<<(ostream &cout, vector<T> &a) {
          for (T i: a) cout << i << ' ';
        return cout;
    }
    template<typename T>
    istream &operator>>(istream &cin, deque<T> &a) {
        for (T &i: a) cin >> i;
        return cin;
    }
    template<typename T>
    ostream &operator<<(ostream &cout, deque<T> &a) {
        for (T i: a) cout << i << ' ';
        return cout;
    }
}
using namespace FAST;
const long long inf = 1e17 + 7;
const int mod = 1e9 + 7;
const int md = 998244353;
string A, B;
vector<ar<int,3>>cnt(100005);
vector<int>g[100000];
int fborders(int a, int b, char x, char y){
    int num = (x - 'A' + 1) * 30 + (y - 'A' + 1);
    
    int l = 0, r = (int)g[num].size()-1, ans = -1;
    while(l <= r){
        int mid = (l + r) / 2;
        if(g[num][mid] >= a){
            r = mid - 1;
            ans = mid;
        }
        else l = mid + 1;
    }
    l = 0, r = (int)g[num].size()-1; int ans2 = -1;
    while(l <= r){
        int mid = (l + r) / 2;
        if(g[num][mid] <= b){
            l = mid + 1;
            ans2 = mid;
        }
        else r = mid - 1;
    }
    // cout << ans << " " << ans2 << " " << num << "\n";
    if(ans == -1 || ans2 == -1)return 0;
    return ans2 - ans + 1;
}
void init(string a, string b){
    A = a;
    B = b;
    for(int i = 0;i<A.size();i++){
        if(i > 0){
            cnt[i][0] = cnt[i-1][0];
            cnt[i][1] = cnt[i-1][1];
            cnt[i][2] = cnt[i-1][2];
        }
        cnt[i][0] += (A[i] == 'A') - (B[i] == 'A');
        cnt[i][1] += (A[i] == 'B') - (B[i] == 'B');
        cnt[i][2] += (A[i] == 'C') - (B[i] == 'C');
    }
    for(int i = 0;i<A.size();i++){
        int num = (A[i] - 'A' + 1) * 30 + (B[i] - 'A' + 1);
        g[num].pb(i);
    }
}
int get_distance(int x, int y) {
    int a = 0, b = 0, c = 0;
    if(x > 0){
        a = cnt[x-1][0];
        b = cnt[x-1][1];
        c = cnt[x-1][2];
    }
    if(!(cnt[y][0] - a == 0 && cnt[y][1] - b == 0 && cnt[y][2] - c == 0))return -1;
    int res = 0;
    
    int cnt = 0, cont = 0;
    cnt += min(fborders(x, y, 'A', 'T'), fborders(x, y, 'T', 'A'));
    cnt += min(fborders(x, y, 'A', 'C'), fborders(x, y, 'C', 'A'));
    cnt += min(fborders(x, y, 'C', 'T'), fborders(x, y, 'T', 'C'));
    cont += fborders(x, y, 'A', 'A');
    cont += fborders(x, y, 'C', 'C');
    cont += fborders(x, y, 'T', 'T');
    // for(auto to:g[91])cout << to << " ";
    // cout << "\n";
    
    // cout << fborders(x, y, 'A', 'C') << " " << fborders(x, y, 'C', 'A') << "\n";
    res = (y-x+1 - cnt*2 - cont) / 3 * 2;
    res += cnt;
    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... |