Submission #1186594

#TimeUsernameProblemLanguageResultExecution timeMemory
1186594NonozeCrayfish scrivener (IOI12_scrivener)C++20
100 / 100
610 ms202320 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define sz(x) (int)(x).size()

struct trie {
	int next[26], sz;
	char ch;
	vector<int> up;
	trie() {
		memset(next, -1, sizeof(next));
		ch=0, sz=0;
	}
};

vector<trie*> tries;
vector<int> empls;


void Init() {
	tries.pb(new trie());
	empls.pb(0);
}

void TypeLetter(char L) {
	int act = empls.back();
	if (tries[act]->next[L-'a']!=-1) {
		empls.pb(tries[act]->next[L-'a']);
		return;
	}
	tries[act]->next[L-'a'] = sz(tries);
	tries.pb(new trie()), empls.pb(sz(tries)-1); tries.back()->ch=L, tries.back()->sz=tries[act]->sz+1;
	trie *cur=tries.back();
	cur->up.pb(act);
	for (int j=1; j<20; j++) {
		if (sz(tries[cur->up[j-1]]->up)<j) break;
		cur->up.pb(tries[cur->up[j-1]]->up[j-1]);
	}
}

void UndoCommands(int U) {
	empls.pb(empls[sz(empls)-U-1]);
}

char GetLetter(int P) {
	int act=empls.back();
	int k=tries[act]->sz-P-1;
	for (int j=0; j<20; j++) {
		if ((k&(1<<j))) {
			act=tries[act]->up[j];
		}
	}
	return tries[act]->ch;
}
#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...