Submission #1361617

#TimeUsernameProblemLanguageResultExecution timeMemory
1361617altern23Mutating DNA (IOI21_dna)C++20
100 / 100
22 ms14316 KiB
#include "dna.h"

#include <bits/stdc++.h>
using namespace std;

#define ll long long

ll cnt[100005][3][3], N;
ll freqA[100005][3], freqB[100005][3];

void init(string A, string B) {
      N = A.size();

      auto conv = [&](char C) {
            if (C == 'A') return 0;
            if (C == 'T') return 1;
            return 2;
      };

      for (int i = 0; i < N; i++) {
            for (int j = 0; j < 3; j++) {
                  for (int k = 0; k < 3; k++) {
                        if (i) cnt[i][j][k] = cnt[i-1][j][k];
                  }
                  if (i) {
                        freqA[i][j] = freqA[i-1][j];
                        freqB[i][j] = freqB[i-1][j];
                  }
            }

            freqA[i][conv(A[i])]++;
            freqB[i][conv(B[i])]++;

            cnt[i][conv(A[i])][conv(B[i])]++;
      }
}

int get_distance(int x, int y) {

      // check if freq the same
      for (int i = 0; i < 3; i++) {
            if (freqA[y][i]-(!x ? 0LL : freqA[x-1][i]) != freqB[y][i]-(!x ? 0LL : freqB[x-1][i])) return -1;
      }

      auto get = [&](ll a, ll b, ll i, ll j) {
            if (!i) return cnt[j][a][b];
            return cnt[j][a][b]-cnt[i-1][a][b];
      };

      ll cur = y-x+1, ans = 0;
      for (int i = 0; i < 3; i++) {
            cur -= get(i, i, x, y);
            for (int j = i+1; j < 3; j++) {
                  cur -= min(get(i, j, x, y), get(j, i, x, y))*2LL;
                  ans += min(get(i, j, x, y), get(j, i, x, y));
            }
      }

      assert(cur%3 == 0);

	return ans+(cur*2)/3;
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...