Donada la classe que permet gestionar diccionaris on només hi guardem claus úniques usant tries implementats amb la tècnica d’arbres ternaris de cerca (TST), cal implementar el mètode
nat quantes_comencen(string prefix) const;
// Pre: cert
// Post: Retorna el nº de claus que comencen amb el prefix donat
Les claus són del tipus string i els símbols utilitzats per construir el trie són els caràcters de les claus. S’ha usat el caràcter 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 {
public:
dicc(); // Constructora per defecte. Crea un diccionari buit.
~dicc(); // Destructora
// Insereix la clau k en el diccionari. Si ja hi era, no fa res.
void insereix(const string &k);
nat quantes_comencen(string prefix) const;
// Pre: cert
// Post: Retorna el nº de claus que comencen amb el prefix donat
private:
struct node {
char _c; // Símbol posició i-èssima de la clau
node* _esq; // Fill esquerra, apunta a símbols mateixa posició formant un BST
node* _cen; // Fill central, apunta a símbols següent posició
node* _dre; // Fill dret, apunta a símbols mateixa posició formant un BST
node(const char &c, node* esq = nullptr, node* cen = nullptr, node* dre = nullptr);
};
node* _arrel;
static void esborra_nodes(node* t);
static node* insereix(node *t, nat i, const string &k);
// Aquí va l'especificació dels mètodes privats addicionals
};
// Aquí va la implementació del mètode públic i dels mètodes 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 un diccionari i després compta quantes comencen per cadascun dels prefixs donats.
L’entrada conté dos blocs separats per una línia amb 10 guions (———–). El primer bloc consisteix en una llista de strings: són les claus que tindrà el diccionari. El segon bloc consisteix en una altra llista de strings: són els prefixos per comptar les claus del diccionari que els tenen.
Per a cada string d’entrada del segon bloc, escriu una línia amb el nombre de claus que comencen amb aquest prefix, el text " comencen per " i l’string d’entrada.
Només cal enviar la classe requerida i la implementació del mètode . Pots ampliar la classe amb mètodes privats. Segueix estrictament la definició de la classe de l’enunciat.
Per superar els jocs de prova privats, el mètode ha de visitar només els nodes del trie imprescindibles.
Input
---------- O OC
Output
0 comencen per 0 comencen per O 0 comencen per OC
Input
OCA ---------- O OC OCA OCAS C CA CAO
Output
1 comencen per 1 comencen per O 1 comencen per OC 1 comencen per OCA 0 comencen per OCAS 0 comencen per C 0 comencen per CA 0 comencen per CAO
Input
CASA CAS ---------- C CA CAS CASA CASAL S SA A AS
Output
2 comencen per 2 comencen per C 2 comencen per CA 2 comencen per CAS 1 comencen per CASA 0 comencen per CASAL 0 comencen per S 0 comencen per SA 0 comencen per A 0 comencen per AS
Input
DAU DIT AU AVI CASA COP CAP CAPA OU OLA UN EXTRA FUM FOC ILLA ALA AL ---------- A E I O U C CA CAP CAPA CAPAR D DA DAU DAUS F FO FOU
Output
17 comencen per 4 comencen per A 1 comencen per E 1 comencen per I 2 comencen per O 1 comencen per U 4 comencen per C 3 comencen per CA 2 comencen per CAP 1 comencen per CAPA 0 comencen per CAPAR 2 comencen per D 1 comencen per DA 1 comencen per DAU 0 comencen per DAUS 2 comencen per F 1 comencen per FO 0 comencen per FOU