Cod sursa(job #2135369)

Utilizator StarGold2Emanuel Nrx StarGold2 Data 18 februarie 2018 19:40:46
Problema Trie Scor 80
Compilator cpp Status done
Runda Arhiva educationala Marime 3.22 kb
#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;
}