Submission #1234717

#TimeUsernameProblemLanguageResultExecution timeMemory
1234717veehjMutating DNA (IOI21_dna)C++17
100 / 100
107 ms33304 KiB
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;
typedef long double ld;
typedef long long ll;
#define fi first
#define se second
#define pb push_back
#define sz(a) (ll) a.size()
#define all(x) (x).begin(), (x).end()
#define rep(i, a, b) for (ll i = a; i < b; i++)
#define rrep(i, a, b) for (ll i = a; i >= b; i--)
#define vl vector<ll>
#define vpll vector<pair<ll, ll>>
#define vvl vector<vector<ll>>
#define pll pair<ll, ll>
vl closest_ok;
vector<vvl> mis, no;

void init(std::string a, std::string b) {
  no.assign(2, vvl(sz(a), vl(3, 0)));
  mis.assign(a.size(), vvl(3, vl(3, 0)));
  rep(i, 0, sz(a)){
    if(i!=0) mis[i]=mis[i-1];
    if(i!=0){
      no[0][i]=no[0][i-1];
      no[1][i]=no[1][i-1];
    }
    if(a[i]==b[i]) continue;
    int aa=0, bb=0;
    if(a[i]=='A') aa=1;
    if(a[i]=='T') aa=2;
    if(b[i]=='A') bb=1;
    if(b[i]=='T') bb=2;
    no[0][i][aa]++;
    no[1][i][bb]++;
    mis[i][aa][bb]++;
  }
}

int get_distance(int x, int y) { 
  vvl cnt=mis[y];
  if(x!=0){
    rep(i, 0, 3){
      if(no[0][y][i]-no[0][x-1][i]!=no[1][y][i]-no[1][x-1][i]){
        return -1;
      }
      rep(j, 0, 3){
        cnt[i][j]-=mis[x-1][i][j];
      }
    }
  } else {
    rep(i, 0, 3){
      if(no[0][y][i]!=no[1][y][i]){
        return -1;
      }
    }
  }
  ll ans=0;
  rep(i, 0, 3){
    rep(j, 0, 3){
      ll dist=min(cnt[i][j], cnt[j][i]);
      ans+=dist;
      cnt[i][j]-=dist;
      cnt[j][i]-=dist;
    }
  }
  ans+=(cnt[0][1]+cnt[0][2])*2;
  return ans;
}
#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...