Submission #538278

#TimeUsernameProblemLanguageResultExecution timeMemory
538278timreizinCrayfish scrivener (IOI12_scrivener)C++17
100 / 100
571 ms165420 KiB
#include <vector> #include <array> #include <string> using namespace std; struct Trie { array<int, 26> empty; vector<array<int, 26>> child; vector<array<int, 21>> up; vector<int> len; string chars; Trie() { empty.fill(-1); child.push_back(empty); up.push_back(array<int, 21>()); up[0].fill(0); len.push_back(0); chars.push_back(' '); } int add(int v, char c) { if (child[v][c - 'a'] == -1) { child[v][c - 'a'] = child.size(); child.push_back(empty); up.push_back(array<int, 21>()); up[child[v][c - 'a']][0] = v; for (int i = 1; i < 21; ++i) up[child[v][c - 'a']][i] = up[up[child[v][c - 'a']][i - 1]][i - 1]; len.push_back(len[v] + 1); chars.push_back(c); } v = child[v][c - 'a']; return v; } char get(int v, int i) { i = len[v] - i - 1; for (int j = 20; j >= 0; --j) if (i & (1 << j)) v = up[v][j]; return chars[v]; } }; Trie trie; vector<int> pos{0}; void Init() { } void TypeLetter(char L) { pos.push_back(trie.add(pos.back(), L)); } void UndoCommands(int U) { //2 pos.push_back(pos[(int)pos.size() - U - 1]); } char GetLetter(int P) { return trie.get(pos.back(), P); }
#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...