Nu aveti permisiuni pentru a descarca fisierul grader_test10.ok

Cod sursa(job #416807)

Utilizator ssergiussSergiu-Ioan Ungur ssergiuss Data 13 martie 2010 16:02:41
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
# include <algorithm>
# include <fstream>
# include <string>

using namespace std;

# define Alf 26

const char Input[] = "trie.in";
const char Output[] = "trie.out";

struct trie {

    int cnt, nr_fii;
    trie *fiu[ Alf ];

    trie() {

        cnt = nr_fii = 0;
        memset( fiu, 0, sizeof( fiu ) );
    }
};

string s;
trie *t = new trie;

void ins( trie *nod, const string :: iterator it ) {

    if( it == s.end() ) {

        ++nod->cnt;
        return;
    }

    if( nod->fiu[ *it - 'a' ] == 0 ) {

        nod->fiu[ *it - 'a' ] = new trie;
        ++nod->nr_fii;
    }

    ins( nod->fiu[ *it - 'a' ], it + 1 );
}

int del( trie *nod, const string :: iterator it ) {

    if( it == s.end() )
        --nod->cnt;
    else if( del( nod->fiu[ *it - 'a' ], it + 1 ) ) {

        nod->fiu[ *it - 'a' ] = 0;
        --nod->nr_fii;
    }

    if( nod->cnt == 0 && nod->nr_fii == 0 && nod != t ) {

        delete nod;
        return 1;
    }

    return 0;
}

int que( trie *nod, const string :: iterator it ) {

    if( it == s.end() )
        return nod->cnt;

    if( nod->fiu[ *it - 'a' ] )
        return que( nod->fiu[ *it - 'a' ], it + 1 );

    return 0;
}

int pre( trie *nod, const string :: iterator it, const int &k ) {

    if( it == s.end() )
        return k;

    if( nod->fiu[ *it - 'a' ] == 0 )
        return k;

    return pre( nod->fiu[ *it - 'a' ], it + 1, k + 1 );
}

int main() {

    ifstream fin( Input );
    ofstream fout( Output );

    int tip;

    while( fin >> tip ) {

        fin >> s;

        if( tip == 0 ) {

            ins( t, s.begin() );
            continue;
        }
        if( tip == 1 ) {

            del( t, s.begin() );
            continue;
        }
        if( tip == 2 ) {

            fout << que( t, s.begin() ) << "\n";
            continue;
        }
        if( tip == 3 ) {

            fout << pre( t, s.begin(), 0 ) << "\n";
            continue;
        }
    }

    fin.close();
    fout.close();

    return 0;
}