Cod sursa(job #1239276)

Utilizator xtreme77Patrick Sava xtreme77 Data 8 octombrie 2014 17:25:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.98 kb
#include <fstream>
#include <cstring>

const char IN [ ] = "trie.in" ;
const char OUT [ ] = "trie.out" ;
const int ALPHA = 26 ;

using namespace std;

ofstream fout ( OUT ) ;

char sir [ ALPHA + 14 ] ;

struct TRIE {
    int cnt ;
    int fii ;
    TRIE *beta [ ALPHA ] ;
    TRIE ( )
    {
        cnt = 0 ;
        fii = 0 ;
        memset ( beta , 0 , sizeof ( beta ) ) ;
    }
};

TRIE *T = new TRIE ;

void bag ( TRIE *nod , char *s )
{
    if ( *s == '\n' )
    {
        nod -> cnt ++ ;
        return ;
    }
    if ( nod -> beta [ *s - 'a' ] == 0 )
    {
        nod -> beta [ *s - 'a' ] = new TRIE ;
        nod -> fii ++ ;
    }
    bag ( nod -> beta [ *s - 'a' ] , s + 1 ) ;
}

int scot ( TRIE *nod , char *s )
{
    if ( *s == '\n' )
    {
        nod -> cnt -- ;
    }
    else if ( scot ( nod -> beta [ *s - 'a' ] , s + 1 ) )
    {
        nod -> beta [ *s - 'a' ] = 0 ;
        nod -> fii -- ;
    }
    if ( nod -> cnt == 0 and nod -> fii == 0 and nod != T )
    {
        delete nod ;
        return 1 ;
    }
    return 0 ;
}

int query ( TRIE *nod , char *s )
{
    if ( *s == '\n' )
    {
        return nod -> cnt ;
    }
    if ( nod -> beta [ *s - 'a' ] )
        return query ( nod -> beta [ *s - 'a' ] , s + 1 ) ;
    return 0 ;
}

int pre ( TRIE *nod , char *s , int k )
{
    if ( *s == '\n' or nod -> beta [ *s - 'a' ] == 0 )
        return k ;
    return pre ( nod -> beta [ *s - 'a' ] , s + 1 , k + 1 ) ;
}
int main(              )
{
    freopen ( IN , "r" , stdin ) ;
    fgets ( sir , ALPHA + 14 , stdin ) ;
    while ( ! feof ( stdin ) ){
        switch ( sir [ 0 ] ){
            case '0' : bag ( T , sir + 2 ) ; break ;
            case '1' : scot ( T , sir + 2 ) ; break ;
            case '2' : fout << query ( T , sir + 2 ) << '\n' ; break ;
            case '3' : fout << pre ( T , sir + 2 , 0 ) << '\n' ; break ;
        }
        fgets ( sir , ALPHA + 14 , stdin ) ;
    }
    return 0;
}