Submission #1022818

#TimeUsernameProblemLanguageResultExecution timeMemory
1022818Mr_HusanboyCrayfish scrivener (IOI12_scrivener)C++17
100 / 100
445 ms106168 KiB
#include <bits/stdc++.h>

using namespace std;
#define all(a) (a).begin()
#define ff first
#define ss second
#define ll long long

template<typename T>
int len(T &a){
	return a.size();
}

const int maxn = 1e6;

#ifdef LOCAL
template<typename T>
void out(T a){
	for(auto u : a) cout << u << ' ';
	cout << endl;
}
#else
#define out(...)
#endif

struct tree{
	struct node{
		int sz = 0;
		char let;
		vector<int> par;
		node () {}
		node (char c) : let(c), par(20){}
	};
	vector<node> t;
	int cur = 0;

	tree (){ t.resize(maxn);}

	void push(int fr, char x){
		t[cur] = node(x);
		if(fr == -1) t[cur].sz = 1;
		else{
			t[cur].par[0] = fr;
			for(int i = 1; i < 20; i ++){
				t[cur].par[i] = t[t[cur].par[i - 1]].par[i - 1];
			}
			t[cur].sz = t[fr].sz + 1;
		}
		cur ++;
	}

	int len(){return cur;}

	char getkth(int i, int k){
		k = t[i].sz - k - 1;
		for(int j = 0; j < 20; j ++){
			if((1 << j) & k){
				i = t[i].par[j];
			}
		}
		return t[i].let;
	}
} tr;
vector<int> ops;
int cur = 0;

void Init(){
	ops.push_back({-1});
}



int cnt = 0;

void TypeLetter(char c){
	tr.push(ops.back(), c);
	ops.push_back(tr.len() - 1);
}

void UndoCommands(int u){
	ops.push_back(ops[len(ops) - u - 1]);
}

char GetLetter(int p){
	return tr.getkth(ops.back(), p);
}
#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...