Submission #538805

#TimeUsernameProblemLanguageResultExecution timeMemory
538805__VariattoCrayfish scrivener (IOI12_scrivener)C++17
74 / 100
651 ms262144 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define fi first
#define se second
#define ll long long
const int L=20, A=30, MAX=1e6+10;
struct st{
    st *jump[L+2], *g[A];
    int war, gle;
};
int licznik;
st *ope[MAX];
st *root=new st;
void Init(){
    for(int i=0; i<A-1; i++)
        root->g[i]=nullptr;
    for(int i=0; i<L; i++)
        root->jump[i]=root;
    root->gle=-1;
    ope[0]=root;
}
void dodaj(st *v, char c){
    if(v->g[c-'a']==nullptr){
        st *nowy=new st;
        for(int i=0; i<A-1; i++)
            nowy->g[i]=nullptr;
        nowy->war=c-'a';
        nowy->gle=v->gle+1;
        nowy->jump[0]=v;
        for(int i=1; i<=L; i++)
            nowy->jump[i]=nowy->jump[i-1]->jump[i-1];
        v->g[c-'a']=nowy;
    }
}
void TypeLetter(char c){
    licznik++;
    st *akt=ope[licznik-1];
    dodaj(akt, c);
    akt=akt->g[c-'a'];
    ope[licznik]=akt;
}
void UndoCommands(int x){
    licznik++;
    ope[licznik]=ope[licznik-x-1];
}
char GetLetter(int pos){
    st *akt=ope[licznik];
    //cout<<akt<<"\n";
    int x=akt->gle-pos, l=0;
    while(x){
        if(x%2) akt=akt->jump[l];
        x/=2, l++;
    }
    return char(akt->war+'a');
}
#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...