Submission #1195724

#TimeUsernameProblemLanguageResultExecution timeMemory
1195724NonozeMutating DNA (IOI21_dna)C++20
43 / 100
1597 ms13728 KiB
#include "dna.h"
#include <bits/stdc++.h>
using namespace std;

int is(char c) {
	if (c=='A') return 0;
	else if (c=='C') return 1;
	return 2;
}

int n;
vector<vector<int>> prefa, prefb;
vector<int> diff;
string a, b;

void init(string A, string B) {
	a=A, b=B;
	n=(int)a.size();
	prefa.push_back({0, 0, 0}), prefb.push_back({0, 0, 0}), diff.push_back(0);
	for (int i=0; i<n; i++) {
		prefa.push_back(prefa.back()), prefb.push_back(prefb.back()), diff.push_back(diff.back());
		prefa.back()[is(a[i])]++, prefb.back()[is(b[i])]++, diff.back()+=a[i]!=b[i];
	}
}

int get_distance(int x, int y) {
	if (prefa[y+1][0]-prefa[x][0]!=prefb[y+1][0]-prefb[x][0] || prefa[y+1][1]-prefa[x][1]!=prefb[y+1][1]-prefb[x][1] || prefa[y+1][2]-prefa[x][2]!=prefb[y+1][2]-prefb[x][2]) return -1;
	int cnt=0;
	for (int i=x; i<=y; i++) cnt+=a[i]!=b[i];
	assert(diff[y+1]-diff[x]==cnt);
	return (diff[y+1]-diff[x]+1)/2;
}
#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...