Cod sursa(job #2332189)

Utilizator borscalinCalin-Stefan Georgescu borscalin Data 30 ianuarie 2019 15:02:00
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.71 kb
#include <iostream>
#include <fstream>

#define MAXCH 26

using namespace std;

ifstream fin ( "trie.in" );
ofstream fout ( "trie.out" );

class Node {
public:
    int nrp, nrc;
    Node* fii[MAXCH];

    Node( ) {
        nrp = nrc = 0;

        for ( int i = 0; i < MAXCH; i++ )
            fii[i] = NULL;
    }
};

Node* Insert ( Node* node, char* s ) {
    if ( node == NULL )
        node = new Node;

    node->nrp++;

    if ( s[0] == '\0' )
        node->nrc++;
    else
        node->fii[s[0] - 'a'] = Insert ( node->fii[s[0] - 'a'], s + 1 );

    return node;
}

Node* Erase ( Node* node, char* s ) {
    node->nrp--;

    if ( s[0] == '\0' )
        node->nrc--;
    else
        node->fii[s[0] - 'a'] = Erase ( node->fii[s[0] - 'a'], s + 1 );

    if ( node->nrp == 0 ) {
        delete ( node );
        node = NULL;
    }

    return node;
}

int Search ( Node* node, char* s ) {
    if ( node == NULL )
        return 0;

    if ( s[0] == '\0' )
        return node->nrc;
    else
        return Search ( node->fii[s[0] - 'a'], s + 1 );
}

int Cmlpc ( Node* node, char* s ) {
    if ( node == NULL )
        return -1;

    if ( s[0] == '\0' )
        return 0;
    else
        return 1 + Cmlpc ( node->fii[s[0] - 'a'], s + 1 );
}

int main() {
    int op;
    char cuv[MAXCH];

    Node* trie = NULL;

    while ( fin >> op ) {
        fin >> cuv;

        if ( op == 0 )
            trie = Insert ( trie, cuv );
        else if ( op == 1 )
            trie = Erase ( trie, cuv );
        else if ( op == 2 )
            fout << Search ( trie, cuv ) << '\n';
        else
            fout << Cmlpc ( trie, cuv ) << '\n';
    }

    return 0;
}