제출 #621034

#제출 시각아이디문제언어결과실행 시간메모리
621034Sam_a17DNA 돌연변이 (IOI21_dna)C++17
100 / 100
45 ms7304 KiB
#include <bits/stdc++.h>
using namespace std;

#define sz(x) (int)x.size()
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define uniq(x) x.resize(unique(all(x)) - x.begin());
#define dbg(x) cout  << #x << " " << x << endl;
#define ll long long
#define ld long double

// template<typename T>
// void pr(vector<T>& a) {
//   for(auto i: a) {
//     cout << i << " ";
//   }
//   cout << endl;
// }
void pr(vector<pair<int, int>>& a) {
  for(auto i: a) {
    cout << "{" << i.first << "," << i.second << "}" << " ";
  }
  cout << endl;
}

void pr(vector<pair<pair<int, int>, int>>& a) {
  for(auto i: a) {
    cout << "{ {" << i.first.first << "," << i.first.second << "}" << ", " << i.second << "} ";
  }
  cout << endl;
}
void build(vector<int> u, vector<int> v, vector<int> a, vector<int> b);

const int N = 2e5 + 10;
int p1[N][3], p2[N][3];
int ac[N], ca[N];
int at[N], ta[N];
int ct[N], tc[N];
int n;

void init(std::string a, std::string b) {
  n = sz(a);

  map<pair<char, char>, int> mp;
  for(int i = 0; i < n; i++) {
    p1[i + 1][0] += p1[i][0] + (a[i] == 'A');
    p1[i + 1][1] += p1[i][1] + (a[i] == 'T');
    p1[i + 1][2] += p1[i][2] + (a[i] == 'C');
  
    p2[i + 1][0] += p2[i][0] + (b[i] == 'A');
    p2[i + 1][1] += p2[i][1] + (b[i] == 'T');
    p2[i + 1][2] += p2[i][2] + (b[i] == 'C');

    ac[i + 1] = ac[i];
    ca[i + 1] = ca[i];
    at[i + 1] = at[i];
    ta[i + 1] = ta[i];
    ct[i + 1] = ct[i];
    tc[i + 1] = tc[i];

    if(a[i] == 'A' && b[i] == 'C') {
      ac[i + 1]++;
    }
    if(a[i] == 'A' && b[i] == 'T') {
      at[i + 1]++;
    }
    if(a[i] == 'C' && b[i] == 'T') {
      ct[i + 1]++;
    }
    if(a[i] == 'C' && b[i] == 'A') {
      ca[i + 1]++;
    }
    if(a[i] == 'T' && b[i] == 'A') {
      ta[i + 1]++;
    }
    if(a[i] == 'T' && b[i] == 'C') {
      tc[i + 1]++;
    }
  }
}

int get_distance(int x, int y) {
  x++, y++;
  swap(x, y);

  int a1 = p1[x][0] - p1[y - 1][0];
  int t1 = p1[x][1] - p1[y - 1][1];
  int c1 = p1[x][2] - p1[y - 1][2];

  int a2 = p2[x][0] - p2[y - 1][0];
  int t2 = p2[x][1] - p2[y - 1][1];
  int c2 = p2[x][2] - p2[y - 1][2];

  if(a1 != a2 || t1 != t2 || c1 != c2) {
    return -1;
  }
  
  int answ = 0;
  int tta = ta[x] - ta[y - 1];
  int aat = at[x] - at[y - 1];
  int mini = min(tta, aat);
  tta -= mini, aat -= mini;
  answ += mini;

  int ttc = tc[x] - tc[y - 1];
  int cct = ct[x] - ct[y - 1];
  mini = min(ttc, cct);
  answ += mini;
  cct -= mini, ttc -= mini;

  int aac = ac[x] - ac[y - 1];
  int cca = ca[x] - ca[y - 1];
  mini = min(aac, cca);
  answ += mini;
  cca -= mini, aac -= mini;

  int all_sum = aat + tta + ttc + cct + aac + cca;
  assert(all_sum % 3 == 0);

  return answ + 2 * (all_sum / 3);
}
#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...