Submission #1267650

#TimeUsernameProblemLanguageResultExecution timeMemory
1267650JohanMutating DNA (IOI21_dna)C++20
71 / 100
1594 ms4896 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];
string a_, b_;
map < char , int > ch;
vector < char > letters{'A', 'C', 'T'};
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;
  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]; 
    }
  }
}

int get_distance(int x, int y){
  x++, y++;
  string a = a_, b = b_;
  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 >, vector < int > > s;
  for(int i = x; i <= y; i++){
  	if(a[i] != b[i])
  		s[{a[i], b[i]}].push_back(i);
  }
  int cnt = 0;
  while(1){
  	int ok = 0;
  	for(auto i : letters){
  		for(auto j : letters){
  			if(s[{i, j}].size() == 0){
  				ok++;
  				continue;
  			}
  			// cout << i << ' ' << j << endl;
  			if(s[{j, i}].size() != 0){
  				s[{i, j}].pop_back();
  				s[{j, i}].pop_back();
  			}
  			else {
	  			for(auto k : letters){
	  				if(s[{j, k}].size() != 0){
	  					s[{i, k}].push_back(s[{i, j}].back());
	  					s[{i, j}].pop_back();
	  					s[{j, k}].pop_back();
	  					break;
	  				}
	  			}
	  		}
  			cnt++;
  		}
  	}
  	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...