Cod sursa(job #2016803)

Utilizator vlasiuflaviusVlasiu Flavius vlasiuflavius Data 30 august 2017 14:20:00
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 kb
#include <fstream>
#define CH ( *s - 'a' )
using namespace std;
ifstream fin ("trie.in");
ofstream fout ("trie.out");
char s[30];
int x;
struct Trie
{
    int fii,crt;
    Trie *v[26];
    Trie()
    {
        fii = 0;
        crt = 0;
        for( int i = 0 ; i < 26 ; i++ )
            v[ i ] = 0;
    }
};
Trie *T = new Trie;
void ins( Trie *nod , char *s )
{
    if( CH < 0 )
    {
        nod -> crt++;
        return;
    }
    if( nod -> v[ CH ] == 0 )
    {
        nod -> v[ CH ] = new Trie;
        nod -> fii++;
    }
    ins( nod -> v[ CH ] , s + 1 );

}
bool del( Trie *nod , char *s )
{
    if( CH < 0 )
        nod -> crt--;
    else if( del( nod -> v[ CH ] , s + 1 ) )
    {
        nod -> v[ CH ] = 0;
        nod -> fii--;
    }
    if( nod -> crt == 0 && nod -> fii == 0 && nod != T )
    {
        delete nod;
        return 1;
    }
    return 0;
}
int app( Trie *nod , char *s )
{
    if( CH < 0 )
        return nod -> crt;
    if( nod -> v[ CH ] )
        return app( nod -> v[ CH ] , s + 1 );
    return 0;
}
int pre( Trie *nod , char *s , int val )
{
    if( CH < 0 || nod -> v[ CH ] == 0 )
        return val;
    return pre( nod -> v[ CH ] , s + 1 , val + 1 );
}
int main()
{
    while( fin>>x )
    {
        fin>>s;
        switch( x )
        {
            fin.get();
            fin.get( s , 30 );
            case( 0 ) :
                ins( T , s );
                break;
            case( 1 ) :
                del( T , s );
                break;
            case( 2 ) :
                fout<<app( T , s )<<'\n';
                break;
            case( 3 ) :
                fout<<pre( T , s , 0 )<<'\n';
                break;
        }
    }
}