제출 #153038

#제출 시각아이디문제언어결과실행 시간메모리
153038popovicirobertCrayfish scrivener (IOI12_scrivener)C++14
5 / 100
880 ms119392 KiB
#include <bits/stdc++.h> using namespace std; static const int MAXN = (int) 1e6; static int anc_let[MAXN + 1][20], anc[MAXN + 1][20]; static int len[MAXN + 1], cur, sz; static char let[MAXN + 1]; void Init() { cur = sz = 0; len[0] = 0; } void TypeLetter(char L) { sz++; let[sz] = L; len[sz] = len[cur] + 1; anc_let[sz][0] = cur; anc[sz][0] = cur; for(int bit = 1; bit < 20; bit++) { anc[sz][bit] = anc[anc[sz][bit - 1]][bit - 1]; anc_let[sz][bit] = anc_let[anc_let[sz][bit - 1]][bit - 1]; } cur = sz; } void UndoCommands(int U) { int last = cur; for(int bit = 0; bit < 20; bit++) { if(U & (1 << bit)) { cur = anc[cur][bit]; } } sz++; let[sz] = let[cur]; len[sz] = len[cur]; cur = anc[cur][0]; anc[sz][0] = last; anc_let[sz][0] = cur; for(int bit = 1; bit < 20; bit++) { anc[sz][bit] = anc[anc[sz][bit - 1]][bit - 1]; anc_let[sz][bit] = anc_let[anc_let[sz][bit - 1]][bit - 1]; } cur = sz; } char GetLetter(int P) { int ans = cur; P = len[cur] - P - 1; for(int bit = 0; bit < 20; bit++) { if(P & (1 << bit)) { ans = anc_let[ans][bit]; } } return let[ans]; }
#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...