Submission #255671

#TimeUsernameProblemLanguageResultExecution timeMemory
255671AkashiCrayfish scrivener (IOI12_scrivener)C++14
100 / 100
741 ms149776 KiB
//#include "grader.h"
#include <bits/stdc++.h>
using namespace std;

const int DIM = 1e6 + 5;

pair <int, int> cur = {0, 0};

int tt[DIM][21];
int pref[DIM][21];

int nr1, nr2;

char ch[DIM];
int le[DIM], le2[DIM], tang[DIM];
int p2[25];
void Init() {
    p2[0] = 1;
    for (int i = 1; i <= 20 ; ++i)
        p2[i] = p2[i - 1] * 2;
}

void TypeLetter(char L) {
    ++nr1; ++nr2;

    le[nr1] = le[cur.first] + 1;
    ch[nr1] = L;

    pref[nr1][0] = cur.first;
    for (int k = 1; p2[k] < le[nr1] ; ++k)
        pref[nr1][k] = pref[pref[nr1][k - 1]][k - 1];

    le2[nr2] = le2[cur.second] + 1;

    tt[nr2][0] = cur.second;
    for (int k = 1; p2[k] < le2[nr2] ; ++k)
        tt[nr2][k] = tt[tt[nr2][k - 1]][k - 1];

    cur = {nr1, nr2};
    tang[nr2] = nr1;
}

void UndoCommands(int U) {
    ++nr2;

    pair <int, int> aux = cur;
    for (int k = 0; U > 0 ; ++k) {
        if (p2[k] & U) {
            cur.second = tt[cur.second][k];
            U = U ^ p2[k];
        }
    }

    cur = {tang[cur.second], nr2};
    tang[nr2] = cur.first;

    le2[cur.second] = le2[aux.second] + 1;

    tt[cur.second][0] = aux.second;
    for (int k = 1; p2[k] < le2[cur.second] ; ++k)
        tt[cur.second][k] = tt[tt[cur.second][k - 1]][k - 1];
}

char GetLetter(int P) {
    ++P;

    int dif = le[cur.first] - P;
    int ind = cur.first;

    for (int k = 0; dif > 0 ; ++k) {
        if (p2[k] & dif) {
            ind = pref[ind][k];
            dif = dif ^ p2[k];
        }
    }

    return ch[ind];
}
#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...