Submission #362048

#TimeUsernameProblemLanguageResultExecution timeMemory
362048idk321Crayfish scrivener (IOI12_scrivener)C++11
100 / 100
396 ms34156 KiB


#include <iostream>

const int N = 1000005;

using namespace std;
typedef long long ll;

int cur;


struct Node
{
    Node* par1;
    Node* par2;
    int h;
    char c;

    Node(char c)
    {
        par1 = nullptr;
        par2 = nullptr;
        h = -1;
        this->c = c;
    }

    Node(Node* par, char c)
    {
        par1 = par;
        h = par->h + 1;
        int dist1 = par->par2->h - par->h;
        int dist2 = par->par2->par2->h - par->par2->h;
        if (dist1 == dist2)
        {
            par2 = par->par2->par2;
        } else
        {
            par2 = par;
        }
        this->c = c;
    }
};
Node* nodes[N];

char getKth(int i, Node* node)
{
    if (node->h == i) return node->c;
    if (node->par2->h >= i) return getKth(i, node->par2);
    return getKth(i, node->par1);
}



void Init()
{
    nodes[0] = new Node(' ');
    nodes[0]->par1 = nodes[0];
    nodes[0]->par2 = nodes[0];
    nodes[0]->h = -1;
    cur = 0;
}

void TypeLetter(char L) {

    cur++;
    nodes[cur] = new Node(nodes[cur - 1], L);
}

void UndoCommands(int U) {
    nodes[cur + 1] = nodes[cur - U];
    cur++;
}

char GetLetter(int P) {
    char c = getKth(P, nodes[cur]);
  return c;
}
#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...