Submission #1009633

#TimeUsernameProblemLanguageResultExecution timeMemory
1009633somefjordMutating DNA (IOI21_dna)C++17
56 / 100
26 ms6484 KiB
#include "dna.h"
#include <bits/stdc++.h>

using namespace std;

string as, bs;
vector<int> cc[3];
vector<int> lc[6];

char letters[3] = {'A', 'T', 'C'};
char combos[][3] = {{'A', 'T'}, {'A', 'C'}, {'T', 'C'}};

void init(string a, string b) {
  as = a;
  bs = b;

  int n = a.length();
  for (int i = 0; i < 3; ++i) {
    cc[i].resize(n + 2, 0);
  }
  for (int i = 0; i < 6; ++i) {
    lc[i].resize(n + 2, 0);
  }

  for (int i = 1; i <= n; ++i) {
    for (int ci = 0; ci < 3; ++ci) {
      cc[ci][i] = cc[ci][i - 1] +
                  ((as[i - 1] == combos[ci][0] && bs[i - 1] == combos[ci][1]) ||
                   (as[i - 1] == combos[ci][1] && bs[i - 1] == combos[ci][0]));
      lc[ci][i] = lc[ci][i - 1] + (as[i - 1] == letters[ci]);
      lc[ci + 3][i] = lc[ci + 3][i - 1] + (bs[i - 1] == letters[ci]);
    }
  }
}

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

  int c1 = cc[0][y] - cc[0][x];
  int c2 = cc[1][y] - cc[1][x];
  int c3 = cc[2][y] - cc[2][x];
  int lc1 = lc[0][y] - lc[0][x];
  int lc2 = lc[1][y] - lc[1][x];
  int lc3 = lc[2][y] - lc[2][x];
  int lc4 = lc[3][y] - lc[3][x];
  int lc5 = lc[4][y] - lc[4][x];
  int lc6 = lc[5][y] - lc[5][x];

  int count = 0;
  if (lc1 != lc4 || lc2 != lc5 || lc3 != lc6)
    return -1;
  int remaining = c1 + c2 + c3;

  if (!(c1 & 1)) {
    remaining -= c1;
    count += c1 / 2;
  }
  if (!(c2 & 1)) {
    remaining -= c2;
    count += c2 / 2;
  }
  if (!(c3 & 1)) {
    remaining -= c3;
    count += c3 / 2;
  }

  if (remaining)
    count += remaining / 3 * 2;

  return count;
}
#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...