10269 2024. 03. 29 21:00:30 szil Génsebész cpp17 Hibás válasz 0/100 24ms 16532 KiB
#include <bits/stdc++.h>
#include "grader.h"

using namespace std;
using ll = long long;

int char_to_index(char x) {
	if (x == 'A') return 0;
	if (x == 'C') return 1;
	if (x == 'G') return 2;
	if (x == 'T') return 3;
	throw 1;
}

struct Node {
	Node *l, *r;

	int cnt[4], prior, siz;
	char c;

	Node(char x) {
		c = x;
		fill(cnt, cnt+4, 0);
		cnt[char_to_index(x)]++;
		prior = rand();
		siz = 1;
		l = r = nullptr;
	}
};

int get_size(Node *ptr) {
	return ptr ? ptr->siz : 0;
}

void pull(Node *v) {
	v->siz = 1 + get_size(v->l) + get_size(v->r);
	for (int i = 0; i++; i < 4) {
		v->cnt[i] = (char_to_index(v->c) == i);
		if (v->l) v->cnt[i] += v->l->cnt[i];
		if (v->r) v->cnt[i] += v->r->cnt[i];
	}
}

Node *merge(Node *l, Node *r) {
	if (!l || !r) return l ? l : r;
	if (l->prior > r->prior) {
		l->r = merge(l->r, r);
		pull(l);
		return l;
	} else {
		r->l = merge(l, r->l);
		pull(r);
		return r;
	}
}

pair<Node *, Node *> split(Node *v, int x) {
	if (!v) return {nullptr, nullptr};
	if (get_size(v->l) < x) {
		auto [l, r] = split(v->r, x - 1 - get_size(v->l));
		v->r = l;
		pull(v);
		return {v, r};
	} else {
		auto [l, r] = split(v->l, x);
		v->l = r;
		pull(v);
		return {l, v};
	}
}

void print(Node *v, string &res) {
	if (v->l) print(v->l, res);
	res += v->c;
	if (v->r) print(v->r, res);
}

Node *root = nullptr;

void Kezd(string s) {
	for (char c : s) {
		root = merge(root, new Node(c));
	}
}

void Beszur(int i, char x) {
	auto [a, b] = split(root, i);
	root = merge(a, merge(new Node(x), b));
}

void Mutal(int i, char x) {
	auto [a, b] = split(root, i-1);
	auto [c, d] = split(b, 1);
	root = merge(a, merge(new Node(x), d));
}

void Kivag(int i, int j) {
	auto [a, b] = split(root, i-1);
	auto [c, d] = split(b, j-i+1);
	root = merge(a, d);
}

int Szamlal(int i, int j, char x) {
	auto [a, b] = split(root, i-1);
	auto [c, d] = split(b, j-i+1);
	int res = c->cnt[char_to_index(x)];
	root = merge(a, merge(c, d));
	return res;
}

string Eredmeny() {
	string res;
	print(root, res);
	return res;
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Hibás válasz 3ms 1812 KiB
2 Hibás válasz 3ms 2248 KiB
subtask2 0/30
3 Hibás válasz 3ms 2280 KiB
4 Hibás válasz 3ms 2448 KiB
5 Hibás válasz 3ms 2536 KiB
6 Hibás válasz 3ms 2672 KiB
7 Hibás válasz 3ms 2940 KiB
8 Hibás válasz 8ms 6904 KiB
subtask3 0/30
9 Hibás válasz 3ms 3268 KiB
10 Hibás válasz 3ms 3272 KiB
11 Hibás válasz 3ms 3276 KiB
12 Hibás válasz 3ms 3280 KiB
13 Hibás válasz 3ms 3724 KiB
14 Hibás válasz 9ms 8584 KiB
subtask4 0/20
15 Hibás válasz 3ms 3552 KiB
16 Hibás válasz 3ms 3464 KiB
17 Hibás válasz 3ms 3572 KiB
18 Hibás válasz 3ms 3476 KiB
19 Hibás válasz 12ms 9848 KiB
subtask5 0/20
20 Hibás válasz 3ms 3804 KiB
21 Hibás válasz 3ms 3980 KiB
22 Hibás válasz 3ms 4120 KiB
23 Hibás válasz 4ms 4964 KiB
24 Hibás válasz 24ms 16532 KiB