#include <bits/stdc++.h>
using namespace std;
struct node {
node *par[22] = {};
node *child[26] = {};
int dep = 0;
node() {}
} *roots[1000005];
int cround = 0;
void Init() {
roots[0] = new node();
cround = 0;
}
void TypeLetter(char L) {
L -= 'a';
if(roots[cround]->child[L]) {roots[cround+1] = roots[cround]->child[L];}
else {
roots[cround]->child[L] = new node();
roots[cround]->child[L]->par[0] = roots[cround];
for(int i=0;i<21;i++) {
if(roots[cround]->child[L]->par[i]->par[i]) {
roots[cround]->child[L]->par[i+1] = roots[cround]->child[L]->par[i]->par[i];
} else break;
}
roots[cround]->child[L]->dep = roots[cround]->dep + 1;
roots[cround+1] = roots[cround]->child[L];
}
cround++;
}
void UndoCommands(int U) {
roots[cround+1] = roots[cround - U];
cround++;
}
node *getpar(node * cur, int res) {
if(!res) return cur;
if(res > cur->dep) exit(1);
for(int i=20;i>=0;i--) if((1 << i) & res) cur = cur->par[i];
return cur;
}
char GetLetter(int P) {
auto olderpar = getpar(roots[cround], roots[cround]->dep - P), newerpar = getpar(roots[cround], roots[cround]->dep-P-1);
for(int i=0;i<26;i++) {
if(olderpar->child[i] == newerpar) {
return i+'a';
}
}
exit(1);
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |