Submission #119248

#TimeUsernameProblemLanguageResultExecution timeMemory
119248ioilolcomCrayfish scrivener (IOI12_scrivener)C++14
100 / 100
624 ms75760 KiB
#include <vector>
using namespace std;

int node = 0;
int lastnode = 0;
//vector<pair<int,char> > g[1000010];
int dp[23][1000010];
vector<int> curnode;
char chr[1000100];
int depth[1000100];

void Init() {
	dp[0][0] = -1;
	curnode.push_back(0);
	return;
}

void TypeLetter(char L) {
	node++;
	//g[lastnode].push_back(make_pair(node,L));
	dp[0][node] = lastnode;
	for(int k=1; k<=22; k++) {
		if(dp[k-1][node] == -1)
			dp[k][node] = -1;
		else
			dp[k][node] = dp[k-1][dp[k-1][node]];
	}
	chr[node] = L;
	depth[node] = depth[lastnode] + 1;
	curnode.push_back(node);
	lastnode = node;
}

void UndoCommands(int U) {
	int tmpnode = curnode[curnode.size()-U-1];
	lastnode = tmpnode;
	curnode.push_back(lastnode);
}

char GetLetter(int P) {
	int u = lastnode;
	P++;
	for(int i=22; i>=0; i--) {
		if(depth[u]-(1<<i) >= P) {
			u = dp[i][u];
		}
	}
	return chr[u];

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