Cod sursa(job #2730679)

Utilizator SergiuS3003Sergiu Stancu Nicolae SergiuS3003 Data 26 martie 2021 17:50:52
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.94 kb
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
ifstream f ( "trie.in" );
ofstream g ( "trie.out" );
struct Trie
{
    int nrCuv;/// cate cuvinte se termina in nodul curent
    int nrFii;
    Trie *Fiu[26];
    Trie()
    {
        nrFii = 0;
        nrCuv = 0;

        for ( int i = 0; i < 26; ++i )
            Fiu[i] = NULL;
    }
};
Trie *T;
void Add ( Trie *nod, char *s )
{
    if ( *s == '\0' )
        nod->nrCuv++;
    else
    {
        int i = *s - 'a';

        if ( nod->Fiu[i] == NULL )
        {
            nod->Fiu[i] = new Trie();
            nod->nrFii++;
        }

        Add ( nod->Fiu[i], s + 1 );
    }
}
bool Delete ( Trie *nod, char *s )
{
    if ( *s == '\0' )
        nod->nrCuv--;
    else
    {
        int i = *s - 'a';

        if ( Delete ( nod->Fiu[i], s + 1 ) )
        {
            nod->Fiu[i] = NULL;
            nod->nrFii--;
        }
    }

    if ( nod->nrCuv == 0 && nod->nrFii == 0 && nod != T )
    {
        delete nod;
        return 1;
    }

    return 0;
}
int Count ( Trie *nod, char *s )
{
    if ( *s == '\0' )
        return nod->nrCuv;

    int i = *s - 'a';

    if ( nod->Fiu[i] )
        return Count ( nod->Fiu[i], s + 1 );

    return 0;
}
int Lcp ( Trie *nod, char *s, int k )
{
    if ( *s == '\0' )
        return k;

    int i = *s - 'a';

    if ( nod->Fiu[i] == 0 )
        return k;

    return Lcp ( nod->Fiu[i], s + 1, k + 1 );
}
int main()
{
    int op;
    char w[21];
    T = new Trie();

    while ( f >> op >> w )
    {
        switch ( op )
        {
        case 0:
            Add ( T, w );
            break;

        case 1:
            Delete ( T, w );
            break;

        case 2:
            g << Count ( T, w ) << '\n';
            break;

        case 3:
            g << Lcp ( T, w, 0 ) << '\n';
            break;
        }
    }

    return 0;
}