Submission #104241

#TimeUsernameProblemLanguageResultExecution timeMemory
104241arman_ferdousCrayfish scrivener (IOI12_scrivener)C++14
34 / 100
1092 ms190484 KiB
// #include "grader.h"
#include <bits/stdc++.h>
using namespace std;

struct node{
	char c; int d;
	node *to[26];
	vector<node*> p;
	node() {
		d = -1;
		for(int i = 0; i < 26; i++) to[i] = NULL;
	}
};

using pnode = node*;

pnode root, trie_pos;
pnode state[1000010]; int ptr;

void Init() {
	root = new node();
	ptr = 0; state[0] = root;
	trie_pos = root;
}

void TypeLetter(char L) {
	int id = L - 'a';
	if(!trie_pos->to[id])
		trie_pos->to[id] = new node();

	trie_pos->to[id]->d = trie_pos->d + 1;		// update depth
	trie_pos->to[id]->p.push_back(trie_pos);	// set new childs parent
	trie_pos = trie_pos->to[id];				// move it to child
	state[++ptr] = trie_pos;					// update state vector
	trie_pos->c = L;							// update containing char

	for(int j = 1; j < 20; j++) {
		if(trie_pos->p[j-1]) {
			if((trie_pos->p[j-1])->p.size() > j-1)
				trie_pos->p.push_back((trie_pos->p[j-1])->p[j-1]);	
			else break;
		}
		else break;
	}
}

void UndoCommands(int U) {
	state[ptr+1] = state[max(0,ptr-U)]; ptr++;
	trie_pos = state[ptr];
}

char GetLetter(int P) {
	pnode cur = trie_pos;
	int need = trie_pos->d - P;
	for(int j = 19; j >= 0; j--) 
		if(need >= (1<<j)) {
			need -= (1<<j);
			cur = cur->p[j];
		}
	return cur->c;
}

Compilation message (stderr)

scrivener.cpp: In function 'void TypeLetter(char)':
scrivener.cpp:39:36: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
    if((trie_pos->p[j-1])->p.size() > j-1)
       ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~
#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...