Cod sursa(job #1339241)

Utilizator Mr.DoomRaul Ignatus Mr.Doom Data 10 februarie 2015 19:34:45
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.92 kb
#include <fstream>
#include <cstring>
using namespace std;

ifstream is("trie.in");
ofstream os("trie.out");

struct Trie{
    Trie()
    {
        nrcuv = nrfii = 0;
        memset(fii, 0, sizeof(fii));
    }
    Trie *fii[26];
    int nrcuv, nrfii;
};

Trie *T = new Trie;
char cuv[30];

void Insert(Trie *nod, char *s);
bool Delete(Trie *nod, char *s);
int Querry(Trie *nod, char *s);
int Prefix(Trie *nod, char *s, int k);

int main()
{
    while ( is.getline(cuv, 30) )
    {
        switch( cuv[0] )
        {
            case '0' :
                Insert(T, cuv + 2);
                break;
            case '1' :
                Delete(T, cuv + 2);
                break;
            case '2' :
                os << Querry(T, cuv + 2) << '\n';
                break;
            case '3' :
                os << Prefix(T, cuv + 2, 0) << '\n';
                break;
        }
    }
    is.close();
    os.close();
    return 0;
}

void Insert(Trie *nod, char *s)
{
    if ( *s == '\0' )
    {
        nod->nrcuv++;
        return;
    }
    if ( !nod->fii[*s - 'a'] )
    {
        nod->fii[*s - 'a'] = new Trie;
        nod->nrfii++;
    }
    Insert(nod->fii[*s - 'a'], s + 1);
}

bool Delete(Trie *nod, char *s)
{
    if ( *s == '\0' )
        nod->nrcuv--;
    else
        if ( Delete(nod->fii[*s - 'a'], s + 1 ) )
        {
            nod->fii[*s - 'a'] = 0;
            nod->nrfii--;
        }
    if ( !nod->nrcuv && !nod->nrfii && nod != T )
    {
        delete nod;
        return true;
    }
    return false;
}

int Querry(Trie *nod, char *s)
{
    if ( *s == '\0' )
        return nod->nrcuv;
    if ( nod->fii[*s - 'a'] )
        return Querry(nod->fii[*s - 'a'], s + 1);
    return 0;
}
int Prefix(Trie *nod, char *s, int k)
{
    if ( *s == '\0' || !nod->fii[*s - 'a'] )
        return k;
    return Prefix(nod->fii[*s - 'a'], s + 1, k + 1);
}