제출 #414126

#제출 시각아이디문제언어결과실행 시간메모리
414126blue크레이피쉬 글쓰는 기계 (IOI12_scrivener)C++17
5 / 100
1049 ms243848 KiB
#include <vector> #include <iostream> using namespace std; int curr; int len[1000001]; int undo_len[1000001]; char last[1000001]; int letter_anc[1000001][20]; int undo_anc[1000001][20]; int lg2[1000001]; void Init() { lg2[1] = 0; for(int i = 2; i <= 1000000; i++) lg2[i] = 1 + lg2[i/2]; curr = 0; len[0] = -1; last[0] = '?'; for(int e = 0; e < 20; e++) letter_anc[0][e] = undo_anc[0][e] = 0; } void TypeLetter(char L) { curr++; len[curr] = len[curr-1] + 1; last[curr] = L; letter_anc[curr][0] = curr-1; undo_anc[curr][0] = curr-1; for(int e = 1; e < 20; e++) { if((1 << e) > 2*max(curr, len[curr])) break; letter_anc[curr][e] = letter_anc[ letter_anc[curr][e-1] ][e-1]; undo_anc[curr][e] = undo_anc[ undo_anc[curr][e-1] ][e-1]; } // cerr << curr << '\n'; } void UndoCommands(int U) { int prev = curr; for(int e = 0; e < 20; e++) { if((1 << (e+1)) > U) break; if(U & (1 << e)) prev = undo_anc[prev][e]; } // cerr << "making copy of " << prev << '\n'; curr++; len[curr] = len[prev]; last[curr] = last[prev]; letter_anc[curr][0] = letter_anc[prev][0]; undo_anc[curr][0] = curr-1; for(int e = 1; e < 20; e++) { if((1 << e) > 2*max(curr, len[curr])) break; letter_anc[curr][e] = letter_anc[ letter_anc[curr][e-1] ][e-1]; undo_anc[curr][e] = undo_anc[ undo_anc[curr][e-1] ][e-1]; } // cerr << curr << '\n'; } char GetLetter(int P) { int pos = curr; for(int e = lg2[len[curr] - P] + 2; e >= 0; e--) if(len[ letter_anc[pos][e] ] >= P) pos = letter_anc[pos][e]; return last[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...