10280 2024. 03. 29 21:55:53 szil Génsebész cpp14 Időlimit túllépés 80/100 250ms 16784 KiB
#include <bits/stdc++.h>
#include "grader.h"

#pragma GCC optimize("O3,unroll-loops")

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);
	fill(v->cnt, v->cnt+4, 0);
	v->cnt[char_to_index(v->c)] = 1;
	if (v->l) {
		for (int i = 0; i < 4; i++) {
			v->cnt[i] += v->l->cnt[i];
		}
	}
	if (v->r) {
		for (int i = 0; i < 4; i++) {
			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};
	}
}

Node *root = nullptr;

void Kezd(string s) {
	srand(2);
	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() {
	if (!root) return "";
	string res;
	stack<Node *> st;
	Node *v = root;
	while (v) {
		st.push(v);
		v = v->l;
	}
	auto next = [&](){
		Node *u = st.top();
		if (u->r) {
			u = u->r;
			while (u) {
				st.push(u);
				u = u->l;
			}
		} else {
			while (true) {
				st.pop();
				if (st.empty()) return;
				Node *par = st.top();
				if (par->l == u) return;
				u = par;
			}
		}
	};
	while (!st.empty()) {
		res += st.top()->c;
		next();
	}
	return res;
}
/*
int main() {
	string s; cin >> s;
	Kezd(s);
	while (true) {
		int op; cin >> op;
		cerr << op << endl;
		if (op == 0) {
			break;
		}
		if (op == 1) {
			int x; char c; cin >> x >> c;
			Beszur(x, c);
		}
		if (op == 2) {
			int x; char c; cin >> x >> c;
			Mutal(x, c);
		}
		if (op == 3) {
			int l, r; cin >> l >> r;
			Kivag(l, r);
		}
		if (op == 4) {
			int l, r, ans; char c; cin >> l >> r >> c >> ans;
			int res = Szamlal(l, r, c);
			// if (ans == res) cout << "Correct\n";
			// else cout << "Incorrect: " << ans << " " << res << "\n";
		}
		if (op == 5) {
			string res = Eredmeny();
			string ans; cin >> ans;
			ans.pop_back();
			// if (ans == res) cout << "Correct\n";
			// else cout << "Incorrect: " << ans << " " << res << "\n";
		}
		cout << Eredmeny() << "\n";
	}
}
*/
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1936 KiB
2 Elfogadva 3ms 2384 KiB
subtask2 30/30
3 Elfogadva 3ms 2460 KiB
4 Elfogadva 3ms 2816 KiB
5 Elfogadva 4ms 3180 KiB
6 Elfogadva 4ms 3296 KiB
7 Elfogadva 7ms 3184 KiB
8 Elfogadva 70ms 6960 KiB
subtask3 30/30
9 Elfogadva 3ms 3256 KiB
10 Elfogadva 3ms 3244 KiB
11 Elfogadva 4ms 3400 KiB
12 Elfogadva 4ms 3484 KiB
13 Elfogadva 7ms 3532 KiB
14 Elfogadva 93ms 8640 KiB
subtask4 20/20
15 Elfogadva 3ms 3444 KiB
16 Elfogadva 3ms 3544 KiB
17 Elfogadva 3ms 3460 KiB
18 Elfogadva 3ms 3552 KiB
19 Elfogadva 119ms 10004 KiB
subtask5 0/20
20 Elfogadva 3ms 3832 KiB
21 Elfogadva 4ms 3948 KiB
22 Elfogadva 4ms 4008 KiB
23 Elfogadva 7ms 4784 KiB
24 Időlimit túllépés 250ms 16784 KiB