Donada la classe que permet gestionar diccionaris on només hi guardem claus úniques usant tries implementats amb la tècnica d’arbres generals amb punters a primer fill i següent germà, cal implementar aquest mètode:
void elimina(const string &k);
// Pre: True
// Post: S'ha eliminat la clau k del diccionari. Si no hi era, no fa res.
Les claus són del tipus string i els símbols utilitzats per construir el trie són els chars de les claus. S’ha usat el char especial ’#’ per indicar la fi de la clau.
Cal enviar a jutge.org la següent especificació de la classe i la implementació del mètode dins del mateix fitxer. La resta de mètodes públics i privats ja estan implementats.
#include <iostream>
using namespace std;
typedef unsigned int nat;
class dicc {
// Diccionari implementat amb un Trie primer fill-següent germà.
// Els germans estan ordenats de menor a major.
public:
// Constructora per defecte. Crea un diccionari buit.
dicc();
// Destructora
~dicc();
void insereix(const string &k);
// Pre: True
// Post: Insereix la clau k en el diccionari. Si ja hi era, no fa res.
void print(ostream &os) const;
// Pre: True
// Post: Imprimeix tot el contingut del Trie pel canal de sortida os
// Horitzontalment s'imprimeix el següent germà de cada node
// Verticalment s'imprimeix el primer fill de cada node
void elimina(const string &k);
// Pre: True
// Post: S'ha eliminat la clau k del diccionari. Si no hi era, no fa res.
private:
struct node {
char _c; // Símbol posició i-èssima de la clau
node* _pf; // Primer fill, apunta a símbols de la següent posició
node* _sg; // Següent germà, apunta a símbols de la mateixa posició
node(const char &c, node* pf = nullptr, node* sg = nullptr);
};
node* _arrel;
static void esborra_nodes(node* t);
static node* insereix(node *t, nat i, const string &k);
static void print(node* t, ostream &os, string prefix);
// Aquí va l'especificació dels mètodes privats addicionals
};
// Aquí va la implementació del mètode públic elimina i privats addicionals
Degut a que jutge.org només permet l’enviament d’un fitxer amb la solució del problema, en el mateix fitxer hi ha d’haver l’especificació de la classe i la implementació del mètode (el que normalment estarien separats en els fitxers i ).
Per testejar la classe disposes d’un programa principal que insereix claus en el trie, mostra el contingut del trie, després elimina una o més claus i torna a mostrar el contingut del trie.
L’entrada conté una llista de strings separats per canvis de línia: són les claus que tindrà el diccionari. Després conté una línea amb guions ("———-") i una segona llista de strings separats per canvis de línia: són les claus que s’eliminaran del diccionari.
Mostra el contingut del trie abans i després d’eliminar les claus del trie. Les dues visualitzacions del trie estan separades per una línea amb guions ("———-").
Només cal enviar la classe requerida i la implementació del mètode . Pots ampliar la classe amb mètodes privats. Al principi de cada mètode implementat, dins d’un comentari, cal indicar el cost temporal en funció de (nombre de claus del diccionari), (nombre de símbols de l’alfabet) i/o (nombre mig de símbols que té una clau). Segueix estrictament la definició de la classe de l’enunciat.
Input
---------- OCA
Output
. ---------- .
Input
OCA ---------- OC
Output
O. C. A. #. . ---------- O. C. A. #. .
Input
OCA ---------- OCAT
Output
O. C. A. #. . ---------- O. C. A. #. .
Input
OCA ---------- OCA
Output
O. C. A. #. . ---------- .
Input
CASA CA CAS ---------- CASA
Output
C. A. #S. |#A. ||#. ||. |. . ---------- C. A. #S. |#. |. .
Input
CASA CA CAS ---------- CAS
Output
C. A. #S. |#A. ||#. ||. |. . ---------- C. A. #S. |A. |#. |. .
Input
CASA CA CAS ---------- CA
Output
C. A. #S. |#A. ||#. ||. |. . ---------- C. A. S. #A. |#. |. .
Input
A OU DAU DIT AU AI ILLA ALA AL I ---------- AL
Output
ADIO. |||U. |||#. |||. ||#L. |||L. |||A. |||#. |||. ||. |AI. ||T. ||#. ||. |U. |#. |. #ILU. |||#. |||. ||#A. |||#. |||. ||. |#. |. . ---------- ADIO. |||U. |||#. |||. ||#L. |||L. |||A. |||#. |||. ||. |AI. ||T. ||#. ||. |U. |#. |. #ILU. |||#. |||. ||A. ||#. ||. |#. |. .
Input
A OU DAU DIT AU AI ILLA ALA AL I ---------- ALA
Output
ADIO. |||U. |||#. |||. ||#L. |||L. |||A. |||#. |||. ||. |AI. ||T. ||#. ||. |U. |#. |. #ILU. |||#. |||. ||#A. |||#. |||. ||. |#. |. . ---------- ADIO. |||U. |||#. |||. ||#L. |||L. |||A. |||#. |||. ||. |AI. ||T. ||#. ||. |U. |#. |. #ILU. |||#. |||. ||#. ||. |#. |. .
Input
DAU DIT AU AVI CASA COP CAP CAPA OU OLA UN EXTRAMUR FUM FOC ILLA ALA AL ---------- CAP OU FOC ILLA
Output
ACDEFIOU. |||||||N. |||||||#. |||||||. ||||||LU. |||||||#. |||||||. ||||||A. ||||||#. ||||||. |||||L. |||||L. |||||A. |||||#. |||||. ||||OU. |||||M. |||||#. |||||. ||||C. ||||#. ||||. |||X. |||T. |||R. |||A. |||M. |||U. |||R. |||#. |||. ||AI. |||T. |||#. |||. ||U. ||#. ||. |AO. ||P. ||#. ||. |PS. ||A. ||#. ||. |#A. ||#. ||. |. LUV. ||I. ||#. ||. |#. |. #A. |#. |. . ---------- ACDEFOU. ||||||N. ||||||#. ||||||. |||||L. |||||A. |||||#. |||||. ||||U. ||||M. ||||#. ||||. |||X. |||T. |||R. |||A. |||M. |||U. |||R. |||#. |||. ||AI. |||T. |||#. |||. ||U. ||#. ||. |AO. ||P. ||#. ||. |PS. ||A. ||#. ||. |A. |#. |. LUV. ||I. ||#. ||. |#. |. #A. |#. |. .