Cod sursa(job #1823061)

Utilizator CodrutLemeniCodrut Lemeni CodrutLemeni Data 5 decembrie 2016 21:12:09
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LMAX 50

using namespace std;

char s [ LMAX ];

struct TRIE{
    int cnt , nrfii ;
    TRIE *fiu[26];

    TRIE(){
        cnt = nrfii = 0 ;
        for ( int i = 0 ; i < 26 ; i++ ){
            fiu [i] = NULL;
        }
    }
};

TRIE *t = new TRIE ;


void add(int k, TRIE *x ){
    if ( s [ k ] == 0 ){
        x -> cnt ++ ;
        return ;
    }

    if ( x->fiu [ s[k] - 'a' ] == 0 ){
        x ->fiu [ s [k] - 'a' ] = new TRIE ;
        x->nrfii ++ ;
    }
    add( k+1 , x -> fiu[ s[k] - 'a' ] );

}


bool eras ( int k , TRIE *x ){
    if ( s [ k ] == 0 ){
        x->cnt -- ;
    }else if ( eras( k + 1 , x->fiu [ s[k] - 'a' ] ) ){
        x->nrfii --;
        x->fiu [ s [k] - 'a' ] = 0;
    }

    if( x->cnt == 0 && x->nrfii == 0 && x != t ){
        delete x;
        return 1;
    }
    return 0 ;
}

int nrw ( int k , TRIE *x ){
    if ( s[ k ] == 0 ){
        return x->cnt;
    }
    if ( x->fiu [ s[ k ] - 'a' ] ) {
        return nrw( k + 1 , x->fiu [ s[ k ] - 'a' ] );
    }
    return 0 ;
}

int premax ( int k , TRIE *x , int len ){
    if ( x->fiu [ s [k]- 'a' ] == 0 || s[k] == 0 ){
        return len;
    }
    return premax( k + 1 , x->fiu [ s [k]- 'a' ] , len + 1 );
}

int main(){
    char ch;

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

    while ( scanf( "%c", &ch ) == 1  ){
        scanf( "%s", s );
        if( ch == '0' ){
            add( 0 , t );
        }else if ( ch == '1' ){
            eras( 0 , t );
        }else if ( ch == '2' ){
            printf("%d", nrw( 0 , t ) );
            printf("\n");

        }else {
            printf("%d" , premax ( 0 , t , 0 ) );

            printf("\n");

        }
        scanf("%c" , &ch );
    }


    return 0;
}