제출 #626309

#제출 시각아이디문제언어결과실행 시간메모리
626309juancarlovieriDNA 돌연변이 (IOI21_dna)C++17
84 / 100
1527 ms7636 KiB
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;

int pre[100005][3][3];
int n;
string a, b;

void init(std::string A, std::string B) {
  a = A, b = B;
  n = a.length();
  for (int i = 0; i < n; ++i) {
    if (a[i] == 'A') a[i] = 'a';
    else if (a[i] == 'C') a[i] = 'b';
    else a[i] = 'c';
    if (b[i] == 'A') b[i] = 'a';
    else if (b[i] == 'C') b[i] = 'b';
    else b[i] = 'c';
  }
  for (int i = 0; i < n; ++i) {
    pre[i][a[i] - 'a'][b[i] - 'a']++;
  }
  for (int i = 1; i < n; ++i) {
    for (int j = 0; j < 3; ++j) {
      for (int k = 0; k < 3; ++k) pre[i][j][k] += pre[i - 1][j][k];
    }
  }
  // for (int i = 0; i < 3; ++i) {
  //   for (int j = 0; j < 3; ++j) cout << pre[n - 1][i][j] << ' ';
  //   cout << endl;
  // }
}

int arr[3][3];

int get_distance(int x, int y) {
  // cout << y << endl;
  memset(arr, 0, sizeof arr);
  for (int i = 0; i < 3; ++i) {
    for (int j = 0; j < 3; ++j) {
      arr[i][j] = pre[y][i][j];
      if (x) arr[i][j] -= pre[x - 1][i][j];
      // cout << pre[n - 1][i][j] << ' ';
      // cout << arr[i][j] << ' ';
    }
    // cout << endl;
    // cout << endl;
  }
  int ans = 0;
  for (int rep = 0; rep < 100; ++rep) {
    for (int i = 0; i < 3; ++i) {
      for (int j = 0; j < 3; ++j) {
        if (i == j) continue;
        if (arr[i][j] == 0) continue;
        int take = arr[i][j];
        take = min(take, arr[j][i]);
        arr[i][j] -= take;
        arr[j][i] -= take;
        ans += take;
      }
    }
  }
  for (int rep = 0; rep < 100; ++rep) {
    for (int i = 0; i < 3; ++i) {
      for (int j = 0; j < 3; ++j) {
        if (i == j) continue;
        if (arr[i][j] == 0) continue;
        int take = arr[i][j];
        take = min(take, arr[j][i]);
        arr[i][j] -= take;
        arr[j][i] -= take;
        ans += take;
        if (arr[i][j] == 0) continue;
        for (int k = 0; k < 3; ++k) {
          if (arr[j][k] == 0) continue;
          if (j == k) continue;
          int take = arr[i][j];
          take = min(take, arr[j][k]);
          arr[i][j] -= take;
          arr[j][k] -= take;
          arr[i][k] += take;
          ans += take;
        }
      }
    }
  }
  int can = 1;
  for (int i = 0; i < 3; ++i) for (int j = 0; j < 3; ++j) if (i != j && arr[i][j] != 0) can = 0;
  if (!can) {
    // int cnt = 0;
    vector<vector<int>> cnt(2, vector<int> (3, 0));
    for (int i = x; i <= y; ++i) {
      ++cnt[0][a[i] - 'a'];
      ++cnt[1][b[i] - 'a'];
    }
    int cann = 1;
    for (int i = 0; i < 3; ++i) if (cnt[0][i] != cnt[1][i]) cann = 0;
    assert(cann == 0);
    // cout << cnt[0][0] << ' ' << cnt[1][0] << endl;
  }
  if (!can) return -1;
  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...