Cod sursa(job #1560758)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 3 ianuarie 2016 11:20:45
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.19 kb
/* Trie Tree using classes, implementation in C++ */

#include <cstdio>
#include <cstring>

const int SIGMA = 26;
using namespace std;

class trie_tree {
  private:

    struct trie {

        int cnt_words;
        int cnt_children;
        trie *children[SIGMA];

        trie () {

            cnt_words = NULL;
            cnt_children = NULL;

            for( int i = 0; i < SIGMA; i ++ )
                children[i] = NULL;
        }
      } *Root = new trie;

    void insert_word( trie *Node, char *String ) {

        if( *String == 0 ) {
            Node -> cnt_words ++;
            return;
        }

        if( Node -> children[*String - 'a'] == NULL ) {
            Node -> children[*String - 'a'] = new trie;
            Node -> cnt_children ++;
        }

        insert_word( Node -> children[*String - 'a'], String + 1 );
        return;
    }

    int delete_word( trie *Node, char *String ) {

        if( *String == 0 ) Node -> cnt_words --; else
        if( delete_word( Node -> children[*String - 'a'], String + 1 ) ) {
            Node -> children[*String - 'a'] = NULL;
            Node -> cnt_children --;
        }

        if( Node -> cnt_children == 0 && Node -> cnt_words == 0 && Node != Root ) {
            delete Node;
            return 1;
        }

        return 0;
    }

    int count_word( trie *Node, char *String ) {

        if( *String == 0 )
            return Node -> cnt_words;

        if( Node -> children[*String - 'a'] != NULL )
            return count_word( Node -> children[*String - 'a'], String + 1 );

        return 0;
    }

    int longest_prefix( trie *Node, char *String, int prefix_length ) {

        if( *String == 0 )
            return prefix_length;

        if( Node -> children[*String - 'a'] != NULL )
            return longest_prefix( Node -> children[*String - 'a'], String + 1, prefix_length + 1 );

        return prefix_length;
    }

  public:

    void insert_word( char *String ) {
        insert_word( Root, String );
        return;
    }

    void delete_word( char *String ) {
        delete_word( Root, String );
        return;
    }

    int count_word( char *String ) {
        return count_word( Root, String );
    }

    int longest_prefix( char *String ) {
        return longest_prefix( Root, String, 0 );
    }
};

trie_tree my_trie; char String[SIGMA]; int K;

int main () {

    freopen( "trie.in" ,"r", stdin  );
    freopen( "trie.out","w", stdout );

    while( scanf( "%d", &K ) ) {
        scanf( "%s", String );

        if( String[0] == 0 )
            break;

        switch( K ) {
            case 0: {
                my_trie.insert_word( String );
                break;
            }
            case 1: {
                my_trie.delete_word( String );
                break;
            }
            case 2: {
                printf( "%d\n", my_trie.count_word( String ) );
                break;
            }
            case 3: {
                printf( "%d\n", my_trie.longest_prefix( String ) );
                break;
            }
        }

        memset( String, 0, sizeof( String ) );
    }

    return 0;
}