Cod sursa(job #1484648)

Utilizator AdrianaMAdriana Moisil AdrianaM Data 11 septembrie 2015 16:48:08
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 2.08 kb
#include <fstream>
#include <vector>
#include <cstring>
using namespace std;

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

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

Trie* t;
char s[25];

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

int main()
{
    t = new Trie;
    is.getline(s, 25, '\n');
    do {
        if ( s[0] == '0' ) Insert(t, s + 2);
        else
            if ( s[0] == '1' ) Delete(t, s + 2);
            else
                if ( s[0] == '2' ) Count(t, s + 2);
                else Prefix(t, s + 2, 0);
        is.getline(s, 25, '\n');
    } while ( s[0] != '\0' );
    is.close();
    os.close();
    return 0;
}

void Prefix(Trie *nod, char *cuv, int k)
{
    if ( *cuv == '\0' || !nod->fii[*cuv - 'a'] )
    {
        os << k << "\n";
        return;
    }
    Prefix(nod->fii[*cuv - 'a'], cuv + 1, k + 1);
}

void Count(Trie *nod, char *cuv)
{
    if ( *cuv == '\0' )
    {
        os << nod->nrcuv << "\n";
        return;
    }
    if ( !nod->fii[*cuv - 'a'] )
    {
        os << "0\n";
        return;
    }
    Count(nod->fii[*cuv - 'a'], cuv + 1);
}

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

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