Submission #416977

#TimeUsernameProblemLanguageResultExecution timeMemory
416977snasibov05Crayfish scrivener (IOI12_scrivener)C++14
60 / 100
1051 ms90680 KiB
#include <vector>
#include <string>

using namespace std;

#define pb push_back

const int lg = 20;

struct node{
    char val;
    int idx;
    vector<node*> pr;
    node(char c){
        val = c;
        idx = 0;
        pr.resize(lg);
        pr.assign(lg, nullptr);
    }
};

//vector<node*> v;

vector<int> idx;
vector<char> val;
vector<vector<int>> pr;
vector<int> v;

int k = 1;

void Init() {
    v.pb(0);
    idx.pb(-1);
    val.pb(' ');
    pr.pb(vector<int>(lg, -1));
}

void TypeLetter(char l) {
    int prev = v.back();
    v.pb(k++);
    idx.pb(idx[prev] + 1);
    val.pb(l);
    pr.pb(vector<int>(lg));
    if (prev == 0) prev = -1;
    pr.back()[0] = prev;
    for (int i = 1; i < lg; ++i){
        if (pr.back()[i-1] == -1) break;
        pr.back()[i] = pr[pr.back()[i-1]][i-1];
    }
}

void UndoCommands(int u) {
    int n = v.size();
    int cur = v[n - u - 1];
    v.pb(cur);
}

char GetLetter(int p) {
    int cur = v.back();
    for (int i = lg - 1; i >= 0; --i){
        if (pr[cur][i] != -1 && idx[pr[cur][i]] >= p){
            cur = pr[cur][i];
        }
    }
    return val[cur];
}
#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...