Cod sursa(job #1337483)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 9 februarie 2015 02:30:18
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <fstream>
#include <cstring>
using namespace std;

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

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

Trie *t = new Trie;
int tip;
char cuv[30];

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

int main()
{
    while ( is.getline(cuv, 30))
    {
        tip = cuv[0] - '0';
        if ( !tip )
        {
            Insert(t, cuv + 2);
            continue;
        }
        if ( tip == 1 )
        {
            Delete(t, cuv + 2);
            continue;
        }
        if ( tip == 2 )
        {
            os << Count(t, cuv + 2) << "\n";
            continue;
        }
        os << Prefix(t, cuv + 2) << "\n";
    }
    is.close();
    os.close();
    return 0;
}

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

int Count(Trie* nod, char *s)
{
    if ( *s == '\0' )
        return nod->nrcuv;
    if ( nod->fiu[*s - 'a'] )
        return Count(nod->fiu[*s - 'a'], s + 1);
    return 0;
}

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

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