Submission #1297408

#TimeUsernameProblemLanguageResultExecution timeMemory
1297408baodatMutating DNA (IOI21_dna)C++20
100 / 100
23 ms8764 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long 
#define FOR(i, l, r) for(int i = l; i <= r; i++)
#define FORD(i, l, r) for(int i = l; i >= r; i--)
const int N = 1e5 + 5;
int prefa_a[N], prefa_c[N], prefa_t[N];
int prefb_a[N], prefb_c[N], prefb_t[N];
int diff[N][3][3];
string a, b;
int n;
int get_id(char c){
  if(c == 'A') return 0;
  if(c == 'C') return 1;
  return 2;
}
void init(string __a, string __b){
  a = __a;
  b = __b;
  n = a.size();
  a = ' ' + a;
  b = ' ' + b;
  FOR(i, 1, n){
    prefa_a[i] = prefa_a[i - 1] + (a[i] == 'A');
    prefa_c[i] = prefa_c[i - 1] + (a[i] == 'C');
    prefa_t[i] = prefa_t[i - 1] + (a[i] == 'T');
    prefb_a[i] = prefb_a[i - 1] + (b[i] == 'A');
    prefb_c[i] = prefb_c[i - 1] + (b[i] == 'C');
    prefb_t[i] = prefb_t[i - 1] + (b[i] == 'T');
    int idx1 = get_id(a[i]), idx2 = get_id(b[i]);
    FOR(id1, 0, 2)FOR(id2, 0, 2){
      diff[i][id1][id2] = diff[i - 1][id1][id2];
    }
    diff[i][idx1][idx2] += 1;
  }
}
int geta_a(int l, int r){
  return prefa_a[r] - prefa_a[l - 1];
}

int geta_c(int l, int r){
  return prefa_c[r] - prefa_c[l - 1];
}

int geta_t(int l, int r){
  return prefa_t[r] - prefa_t[l - 1];
}

int getb_a(int l, int r){
  return prefb_a[r] - prefb_a[l - 1];
}

int getb_c(int l, int r){
  return prefb_c[r] - prefb_c[l - 1];
}

int getb_t(int l, int r){
  return prefb_t[r] - prefb_t[l - 1];
}
//0 -> A, 1 -> C, 2 -> T
int get_distance(int l, int r){
  ++l;
  ++r;
  if(geta_a(l, r) == getb_a(l, r) &&
    geta_c(l, r) == getb_c(l, r) &&
    geta_t(l, r) == getb_t(l, r)){
      int ac = diff[r][0][1] - diff[l - 1][0][1];
      int at = diff[r][0][2] - diff[l - 1][0][2];
      int ca = diff[r][1][0] - diff[l - 1][1][0];
      int ct = diff[r][1][2] - diff[l - 1][1][2];
      int ta = diff[r][2][0] - diff[l - 1][2][0];
      int tc = diff[r][2][1] - diff[l - 1][2][1];
      int ans = 0;
      int t;
      //mis of A T 
      t = min(at, ta);
      ans += t;
      at -= t;
      ta -= t;
      //mis of A C 
      t = min(ac, ca);
      ans += t;
      ac -= t;
      ca -= t;
      // mis of C T 
      t = min(tc, ct);
      ans += t;
      tc -= t;
      ct -= t;
      int old = ans;
      //cerr << "AFTER 1 CYCLE:\n" << at << " " << ta << " " << ac << " " << ca << " " << tc << " " << ct << "\n";
      //now AC - CT - TA, take 2 
      ans += 2 * (ac + ct + ta) / 3;
      //AT - TC - CA
      if(ans == old)
      ans += 2 * (at + tc + ca) / 3;
      //CT - TA - AC
      if(ans == old)
      ans += 2 * (ct + ta + ac) / 3;
      return ans;
  }
  else return -1;  
}/*
signed main(){
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  string __a, __b;
  cin >> __a >> __b;
  init(__a, __b);
  int q;
  int case_cnt = 1;
  cin >> q;
  while(q--){
    int l, r;
    cin >> l >> r;
    cout << "Case " << case_cnt++ << ": " <<  get_distance(l, r) << "\n";
  }
  return 0;
}*/
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...