Submission #1267686

#TimeUsernameProblemLanguageResultExecution timeMemory
1267686JohanMutating DNA (IOI21_dna)C++20
100 / 100
73 ms8788 KiB
#include "dna.h"
#include "bits/stdc++.h"
using namespace std;
const int N = 1e5 + 6;
int pa[N][3], pb[N][3], p[N][3][3];
string A, B;
map < char , int > ch;
map < int , char > in;
vector < char > letters{'A', 'T', 'C'};
void init(string a, string b){
  int n = (int)a.size();
  a = '#' + a;
  b = '#' + b;
  A = a, B = b;
  ch['A'] = 0, ch['C'] = 1, ch['T'] = 2;
  in[0] = 'A', in[1] = 'C', in[2] = 'T';
  for(int i = 1; i <= n; i++){
    pa[i][ch[a[i]]]++;
    pb[i][ch[b[i]]]++;
    for(int c = 0; c < 3; c++){
      pa[i][c] += pa[i - 1][c];
      pb[i][c] += pb[i - 1][c]; 
    }
  }
  for(int i = 1; i <= n; i++){
  	p[i][ch[a[i]]][ch[b[i]]]++;
  	for(int c = 0; c < 3; c++)
  		for(int r = 0; r < 3; r++)
  			p[i][c][r] += p[i - 1][c][r];
  }
}

int get_distance(int x, int y){
  x++, y++;
  for(int i = 0; i < 3; i++){
    if(pb[y][i] - pb[x - 1][i] != pa[y][i] - pa[x - 1][i])
      return -1;
  }
  map < pair < char , char > , int > s;
  for(int i = 0; i < 3; i++){
  	for(int j = 0; j < 3; j++){
  		if(i != j)
  			s[{in[i], in[j]}] += (p[y][i][j] - p[x - 1][i][j]);
  	}
  }
  // for(auto i : letters){
  // 	for(auto j : letters){
  // 		if(s[{i, j}] > 0)
  // 			cout << i << ' ' << j << endl;
  // 	}
  // }
  // return 41234912;
  int cnt = 0;
  while(1){
  	int ok = 0;
  	for(auto i : letters){
  		for(auto j : letters){
  			if(i == j){
  				ok++;
  				continue;
  			}
  			if(s[{i, j}] == 0){
  				ok++;
  				continue;
  			}
  			// cout << i << ' ' << j << endl;
  			if(s[{j, i}] != 0){
  				if(s[{i, j}] > s[{j, i}]){
  					s[{i, j}] -= s[{j, i}];
  					cnt += s[{j, i}];
  					s[{j, i}] = 0;
  				}
  				else {
  					s[{j, i}] -= s[{i, j}];
  					cnt += s[{i, j}];
  					s[{i, j}] = 0;
  				}
  			}
  			else {
  				for(auto k : letters){
  					if(s[{j, k}] != 0){
  						if(s[{j, k}] >= s[{i, j}]){
  							s[{j, k}] -= s[{i, j}];
  							cnt += s[{i, j}];
  							s[{i, k}] += s[{i, j}];
  							s[{i, j}] = 0;
  							break;
  						}
  						else {
  							s[{i, j}] -= s[{j, k}];
  							cnt += s[{j, k}];
  							s[{i, k}] += s[{j, k}];
  						}
  					}
  				}
  			}
  		}
  	}
  	if(ok == 9)break;
  }
  return cnt;
}
#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...