제출 #1154289

#제출 시각아이디문제언어결과실행 시간메모리
1154289equation_trackerDNA 돌연변이 (IOI21_dna)C++20
21 / 100
499 ms13332 KiB
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
vector<vector<ll>> prefix_a {}, prefix_b {};
string s, t;
void init(std::string a, std::string b) {
  s = a;
  t = b;
  prefix_a.resize(a.size() + 1, {0, 0, 0});
  prefix_b.resize(b.size() + 1, {0, 0, 0});
  for (ll i = 1; i <= a.size(); i++) {
    switch (a[i-1])
    {
    case 'A':
      prefix_a[i][0]++;
      break;
    case 'C':
      prefix_a[i][1]++;
      break;
    default:
      prefix_a[i][2]++;
      break;
    }
    switch (b[i - 1])
    {
    case 'A':
      prefix_b[i][0]++;
      break;
    case 'C':
      prefix_b[i][1]++;
      break;
    default:
      prefix_b[i][2]++;
      break;
    }
  }
  for (ll i = 1; i <= a.size(); i++) {
    prefix_a[i][0] += prefix_a[i-1][0];
    prefix_a[i][1] += prefix_a[i-1][1];
    prefix_a[i][2] += prefix_a[i-1][2];
    prefix_b[i][0] += prefix_b[i-1][0];
    prefix_b[i][1] += prefix_b[i-1][1];
    prefix_b[i][2] += prefix_b[i-1][2];
  }
}

int get_distance(int x, int y) {
  string a = s, b = t;
  if (y - x <= 2) {
    if (
      (prefix_a[y+1][0] - prefix_a[x][0] != prefix_b[y+1][0] - prefix_b[x][0]) ||
      (prefix_a[y+1][1] - prefix_a[x][1] != prefix_b[y+1][1] - prefix_b[x][1]) ||
      (prefix_a[y+1][2] - prefix_a[x][2] != prefix_b[y+1][2] - prefix_b[x][2])
    ) return -1;
    if (x == y) return 0;
    else if (y == x + 1){
      return (s.substr(x, 2)!=t.substr(x, 2));
    } else {
      if (s.substr(x, 3) == t.substr(x, 3)) return 0;
      else if (a[x] == b[x] || a[x + 1] == b[x+1] || a[y] == b[y]) return 1;
      else return 2;
    }
  }
  return 0;
}
#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...