Cod sursa(job #1602311)

Utilizator laurageorgescuLaura Georgescu laurageorgescu Data 16 februarie 2016 18:35:20
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.94 kb
#include<fstream>
#include<string>

using namespace std;

ifstream fin( "trie.in" ); ofstream fout( "trie.out" );

const int omega = 26;

struct Trie{
    int nrfii, nrcuv;
    Trie *lit[ omega ];

    Trie() {
        for( int i = 0; i < omega; ++ i ) {
            lit[ i ] = NULL;
        }
        nrfii = 0, nrcuv = 0;
    }
};
Trie *rad;
string s;

void adauga( Trie *nod, int pos ) {
    if ( pos == ( int )s.size() ) {
        ++ nod -> nrcuv;
        return ;
    }
    int x = s[ pos ] - 'a';
    if ( nod -> lit[ x ] == NULL ) {
        nod -> lit[ x ] = new() Trie;
        ++ nod -> nrfii;
    }
    adauga( nod -> lit[ x ], pos + 1 );
}
bool sterge( Trie *nod, int pos ) {
    if ( pos == ( int )s.size() ) {
        -- nod -> nrcuv;
    } else if ( sterge( nod -> lit[ s[ pos ] - 'a' ], pos + 1 ) ) {
        -- nod -> nrfii;
        nod -> lit[ s[ pos ] - 'a' ] = NULL;
    }

    if ( nod -> nrcuv == 0 && nod -> nrfii == 0 && nod != rad ) {
        delete nod;
        return 1;
    }
    return 0;
}
int cate( Trie *nod, int pos ) {
    if ( pos == ( int )s.size() ) {
        return nod -> nrcuv;
    }
    if ( nod -> lit[ s[ pos ] - 'a' ] == NULL ) {
        return 0;
    }
    return cate( nod -> lit[ s[ pos ] - 'a' ], pos + 1 );
}
int prefix( Trie *nod, int pos ) {
    if ( pos == ( int )s.size() || nod -> lit[ s[ pos ] - 'a' ] == NULL ) {
        return 0;
    }
    return prefix( nod -> lit[ s[ pos ] - 'a' ], pos + 1 ) + 1;
}
int main() {
    int op;
    rad = new Trie();
    while ( fin >> op ) {
        fin >> s;

        switch( op ) {
            case 0 : {
                adauga( rad, 0 ); break;
            }
            case 1 : {
                sterge( rad, 0 ); break;
            }
            case 2 : {
                fout << cate( rad, 0 ) << "\n"; break;
            }
            default : {
                fout << prefix( rad, 0 ) << "\n"; break;
            }
        }
    }
    fin.close();
    fout.close();
    return 0;
}