제출 #169311

#제출 시각아이디문제언어결과실행 시간메모리
169311AlexLuchianov크레이피쉬 글쓰는 기계 (IOI12_scrivener)C++14
100 / 100
816 ms85880 KiB
#include <iostream>

int const nmax = 1000000;

using ll = long long;
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
#define MAX(a, b) (((a) < (b)) ? (b) : (a))

char last;

int far[20][1 + nmax], ptr = 0;
int level[1 + nmax];
char chr[1 + nmax];

void Init() {}

void TypeLetter(char L) {
  ++ptr;
  far[0][ptr] = ptr - 1;
  for(int h = 1; h < 20; h++)
    far[h][ptr] = far[h - 1][far[h - 1][ptr]];
  level[ptr] = level[ptr - 1] + 1;
  chr[ptr] = L;
}

void UndoCommands(int U) {
  ++ptr;
  far[0][ptr] = far[0][ptr - 1 - U];
  for(int h = 1; h < 20; h++)
    far[h][ptr] = far[h - 1][far[h - 1][ptr]];
  level[ptr] = level[ptr - 1 - U];
  chr[ptr] = chr[ptr - 1 - U];
}

char GetLetter(int P) {
  int target = level[ptr] - 1 - P;
  int pos = ptr;

  for(int h = 19; 0 <= h; h--)
    if((target & (1 << h)))
      pos = far[h][pos];

  return chr[pos];
}
#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...