Submission #137462

#TimeUsernameProblemLanguageResultExecution timeMemory
137462MladenPCrayfish scrivener (IOI12_scrivener)C++17
100 / 100
883 ms145504 KiB
#include<bits/stdc++.h>
#define STIZE(x) fprintf(stderr, "STIZE%d\n", x);
#define PRINT(x) fprintf(stderr, "%s = %d\n", #x, x);
#define NL(x) printf("%c", " \n"[(x)]);
#define lld long long
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second
#define mid (l+r)/2
#define endl '\n'
#define all(a) begin(a),end(a)
#define sz(a) int((a).size())
#define LINF 1000000000000000LL
#define INF 1000000000
#define EPS 1e-9
using namespace std;
#define MAXN 1000010
#define MAXL 22
int trie[MAXN][27], anc[MAXN][MAXL], dub[MAXN];
vector<int> op;
int timer = 0;
void Init() {
    timer = 1;
    op.pb(1);
}

void TypeLetter(char L) {
    int c = L-'a'+1, cur = op.back();
    if(trie[cur][c] == 0) {
        trie[cur][c] = ++timer;
        anc[timer][0] = cur;
        dub[timer] = dub[cur] + 1;
        for(int i = 1; i < MAXL; i++) anc[timer][i] = anc[anc[timer][i-1]][i-1];
    }
    op.pb(trie[cur][c]);
}

void UndoCommands(int U) {
    op.pb(op[sz(op)-1-U]);
}

char GetLetter(int P) {
    int cur = op.back();
    P = dub[cur] - 1 - P;
    for(int k = MAXL-1; k >= 0; k--) {
        if((1<<k) <= P) {
            cur = anc[cur][k];
            P -= (1<<k);
        }
    }
    int par = anc[cur][0];
    for(int i = 1; i < 27; i++) {
        if(trie[par][i] == cur) return ('a'+i-1);
    }
}

Compilation message (stderr)

scrivener.cpp: In function 'char GetLetter(int)':
scrivener.cpp:56:1: warning: control reaches end of non-void function [-Wreturn-type]
 }
 ^
#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...