Escriviu un programa que simuli el manteniment d’una llista d’enters, a base de llegir instruccions que la van actualitzant, i instruccions que la van consultant. La llista d’enters se suposa inicialment buida, i les instruccions son dels següents tipus: afegir elements al principi o final de la llista, treure elements del principi o final de la llista, o consultar quin és el nombre d’elements iguals i consecutius que es troben al principi de la llista, o al final de la llista.
És obligatori utilitzar només el constructor de tipus list com a mecanisme d’emmagatzemament massiu de dades. En particular, no es pot usar ni vector, ni stack, ni queue. Podeu declarar tants list com volgueu i del tipus que volgueu (que no sigui cap altre mecanisme d’emmagatzemament massiu), i podeu usar iteradors sobre llistes.
Entrada
La entrada consisteix en un nombre arbitrari de linies, cadascuna amb una instrucció. Les instruccions poden ser de la següent forma:
push_front x push_back x pop_front pop_back max_equal_left max_equal_right
Sortida
Les instruccions pop_front i pop_back poden escriure error a la sortida, i les instruccions max_equal_left i max_equal_right escriuran un valor a la sortida. Se sobreentén que la llista que simulem està inicialment buida, i que l’efecte de cada instrucció és el següent:
Observació
Els jocs de proves privats són grans. Per tal d’aconseguir superar-los tots i obtenir així la màxima nota, convindrà trobar un enfoc astut que faci que totes les instruccions tinguin cost constant. Això sí, només es pot utilitzar el tipus de dades list, com ja hem mencionat anteriorment.
Input
max_equal_left max_equal_right pop_front pop_back push_front 0 max_equal_left max_equal_right push_back 3 push_back 0 max_equal_left max_equal_right pop_back push_back 3 push_front 0 max_equal_left max_equal_right push_front 3 push_back 3 max_equal_left max_equal_right push_back 3 max_equal_left max_equal_right push_back 0 max_equal_left max_equal_right push_front 5 push_back 6 push_back 6 push_back 0 max_equal_left max_equal_right
Output
0 0 error error 1 1 1 1 2 2 1 3 1 4 1 1 1 1
Input
push_front 0 pop_back push_back 0 max_equal_left push_front 0 push_front 3 max_equal_left max_equal_right push_front 3 pop_front push_front 3 push_front 3 push_back -1 max_equal_right max_equal_right max_equal_right push_front 2 push_front 2 max_equal_right push_front -2 push_front -1 push_front 2 push_back 2 push_front 2 push_front -2 push_front -2 push_back -2 pop_front pop_back push_back -2 pop_front push_front 3 push_back 0 push_back 0 max_equal_left push_front 2 push_front 2 push_front 2 pop_back push_back 2 pop_back push_front 0 max_equal_right push_front 0 push_back -1 pop_front push_front -1 push_back -1 push_front -2 push_back -2
Output
1 1 2 1 1 1 1 1 1