Submission #341454

#TimeUsernameProblemLanguageResultExecution timeMemory
341454KerimCrayfish scrivener (IOI12_scrivener)C++17
100 / 100
604 ms137964 KiB
#define MAXN 1000003
#include "stdio.h"
void Init() {}
const int LOGN=20;
int nd,now,P[MAXN][LOGN],tree[MAXN][26];
int where[MAXN],id,lvl[MAXN];
char arr[MAXN];
char get(int x){int tmp=now;
	for(int i=LOGN-1;i>=0;i--)
		if(x>=(1<<i))
			tmp=P[tmp][i],x-=(1<<i);
	return arr[tmp];
}	
void TypeLetter(char L) {
	if(!tree[now][L-'a']){
		tree[now][L-'a']=++nd;
		arr[nd]=L;
	}
	int to=tree[now][L-'a'];
	P[to][0]=now;lvl[to]=lvl[now]+1;now=to;
	for(int i=1;i<LOGN;i++)
		if(P[now][i-1])
			P[now][i]=P[P[now][i-1]][i-1];
	where[++id]=now;
	//printf("ADD %d\n",now);
}
void UndoCommands(int U) {
	now=where[id-U];where[++id]=now;
	//printf("UNDO %d\n",now);
}
char GetLetter(int P) {
	//printf("%d %d\n",now,lvl[now]);
	return get(lvl[now]-P-1);
}
#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...