Cod sursa(job #1163136)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 1 aprilie 2014 10:34:28
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<fstream>
#define LIT 27

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct nod
{
    int nrap, nrfii;
    nod *urm[LIT];
    nod()
    {
        int i;
        nrap=nrfii=0;
        for (i=0; i<LIT; ++i) urm[i]=NULL;
    }
}*radacina;
char cuv[LIT];
int ok;

void Adauga()
{
    int i=0;
    nod *p, *q;
    p=radacina;
    while (cuv[i]!='\0')
    {
        if (p->urm[cuv[i]-'a']) p=p->urm[cuv[i]-'a'];
        else
        {
            q=new nod; ++p->nrfii;
            p->urm[cuv[i]-'a']=q;
            p=q;
        }
        ++i;
    }
    ++(p->nrap);
}

bool Sterge(int pz, nod* p)
{
    int lit=cuv[pz]-'a';
    bool x;

    if (cuv[pz]=='\0') p->nrap--;
    else
    {
        x=Sterge(pz+1, p->urm[lit]);
        if (x)
        {
            p->urm[lit]=NULL;
            --p->nrfii;
        }
    }

    if (p->nrfii==0 && p->nrap==0 && p!=radacina)
    {
        delete p;
        return true;
    }
    return false;
}

int numar_aparitii()
{
    int i=0;
    nod *p, *q;

    p=radacina;
    for (i=0; cuv[i]!='\0'; p=p->urm[cuv[i]-'a'], ++i)
        if (!p->urm[cuv[i]-'a']) return 0;

    return p->nrap;
}

int prefix(int pz, nod *p)
{
    int i;

    for (i=0; cuv[i]!='\0'; p=p->urm[cuv[i]-'a'], ++i)
        if (p->urm[cuv[i]-'a']==NULL) return i;

    return i;
}

int main()
{
    int op;
    radacina=new nod;
    while (f>>op>>cuv)
        if (!op) Adauga();
        else if (op==1) Sterge(0, radacina);
            else if (op==2) g<<numar_aparitii()<<"\n";
                else g<<prefix(0, radacina)<<"\n";
    f.close();
    g.close();
    return 0;
}