Submission #1274731

#TimeUsernameProblemLanguageResultExecution timeMemory
1274731vlomaczkMutating DNA (IOI21_dna)C++20
100 / 100
95 ms33936 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
typedef long long ll;
using namespace __gnu_pbds;
using namespace std;

template <typename T>
using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

int n;
int M = 100'010;
vector<int> A(M), B(M);
vector<vector<vector<int>>> prefix(M, vector<vector<int>>(3, vector<int>(3, 0)));
vector<vector<int>> prefA(M, vector<int>(3, 0)), prefB(M, vector<int>(3, 0));

int change(char c) {
	if(c=='A') return 0;
	if(c=='T') return 1;
	return 2;
}

void init(string a, string b) {
	n = a.size();
	for(int i=0; i<n; ++i) A[i+1] = change(a[i]);
	for(int i=0; i<n; ++i) B[i+1] = change(b[i]);
	for(int i=1; i<=n; ++i) {
		for(int x=0; x<3; ++x) for(int y=0; y<3; ++y) prefix[i][x][y] = prefix[i-1][x][y];
		prefix[i][A[i]][B[i]]++;
		for(int x=0; x<3; ++x) for(int y=0; y<3; ++y) prefA[i][x] += prefix[i][x][y];
		for(int x=0; x<3; ++x) for(int y=0; y<3; ++y) prefB[i][x] += prefix[i][y][x];
	}
}

int get_distance(int l, int r) {
	++l; ++r;
	vector<vector<int>> t(3, vector<int>(3, 0));
	for(int x=0; x<3; ++x) for(int y=0; y<3; ++y) t[x][y] = prefix[r][x][y] - prefix[l-1][x][y]; 
	for(int x=0; x<3; ++x) if(prefA[r][x]-prefA[l-1][x] != prefB[r][x] - prefB[l-1][x]) return -1;
	int ans = 0;
	ans += min(t[0][1], t[1][0]) + min(t[1][2], t[2][1]) + min(t[0][2], t[2][0]);
	ans += 2*abs(t[0][1]-t[1][0]);
	return ans;
}

/*int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	int n, q;
	cin >> n >> q;
	
	string a,b;
	cin >> a >> b;

	init(a,b);
	while(q--) {
		int l,r; 
		cin >> l >> r;
		cout << get_distance(l,r) << "\n";
	}

	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...