Submission #404482

#TimeUsernameProblemLanguageResultExecution timeMemory
404482radaiosm7Crayfish scrivener (IOI12_scrivener)C++98
100 / 100
603 ms169248 KiB
#include <bits/stdc++.h>
using namespace std;
int currNode, p, i, query;
vector<int> commands;
int up[1000005][21];

typedef struct node {
  int children[26];
  char letter;
  int dep;

  node() {
    fill(children, children+26, -1);
  };
} node;

vector<node> trie;

void Init() {
  currNode = 0;
  trie.emplace_back();
  trie[0].letter = 'a';
  trie[0].dep = -1;
  commands.push_back(0);
  for (i=0; i < 21; ++i) {
    up[0][i] = 0;
  }
}

void TypeLetter(char L) {
  p = currNode;
  if (trie[currNode].children[L-'a'] == -1) {
    trie[currNode].children[L-'a'] = trie.size();
    trie.emplace_back();
  }
  currNode = trie[currNode].children[L-'a'];
  trie[currNode].letter = L;

  up[currNode][0] = p;
  trie[currNode].dep = trie[p].dep+1;
  for (i=1; i < 21; ++i) {
    up[currNode][i] = up[up[currNode][i-1]][i-1];
  }
  commands.push_back(currNode);
}

void UndoCommands(int U) {
  currNode = commands[(int)commands.size()-1-U];
  commands.push_back(currNode);
}

char GetLetter(int P) {
  P = trie[currNode].dep-P;
  query = currNode;
  for (i=0; i < 21 && P > 0; ++i) {
    if (P & 1) {
      query = up[query][i];
    }
    P >>= 1;
  }
  return trie[query].letter;
}
#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...