Cod sursa(job #1419749)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 16 aprilie 2015 13:20:53
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.43 kb
#include <fstream>
#include <cstring>
#include <string>
#define NMAX 21
#define ALF 27

using namespace std;

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

class nod
{
public:
    int numar_cuvinte, numar_litere_ocupate;
    nod *urm[ALF];
    nod()
    {
        numar_cuvinte=numar_litere_ocupate=0;
        for (int i=0; i<ALF; ++i) urm[i]=NULL;
    }
    bool operator=(nod *aux)
    {
        numar_cuvinte=aux->numar_cuvinte;
        numar_litere_ocupate=aux->numar_litere_ocupate;
        for (int i=0; i<ALF; ++i) urm[i]=aux->urm[i];
        return 1;
    }
}*rad;
string cuv;
int op;

void adauga(string cuv)
{
    nod *p=rad, *q;
    for (unsigned int i=0; i<cuv.length(); ++i)
        if (p->urm[cuv[i]-'a']!=NULL) p=p->urm[cuv[i]-'a'];
        else
        {
            ++(p->numar_litere_ocupate);
            q=new nod;
            p->urm[cuv[i]-'a']=q;
            p=q;
        }
    ++(p->numar_cuvinte);
}

void sterge(string cuv)
{
    nod *p=rad, *stiva[NMAX];
    unsigned int lungime_stiva=0;

    stiva[lungime_stiva++]=rad;
    for (unsigned int i=0; i<cuv.length(); ++i)
    {
        p=p->urm[cuv[i]-'a'];
        stiva[lungime_stiva++]=p;
    }

    (stiva[lungime_stiva-1]->numar_cuvinte)--;

    while (lungime_stiva>1)
    {
        --lungime_stiva;
        if (!stiva[lungime_stiva]->numar_cuvinte && !stiva[lungime_stiva]->numar_litere_ocupate)
        {
            delete stiva[lungime_stiva];
            stiva[lungime_stiva-1]->urm[cuv[lungime_stiva-1]-'a']=NULL;
            --(stiva[lungime_stiva-1]->numar_litere_ocupate);
        }
        else break;
    }
}

int numar_aparitii(string cuv)
{
    nod *p=rad;
    for (unsigned int i=0; i<cuv.length(); ++i)
        if (p->urm[cuv[i]-'a']==NULL) return 0;
        else p=p->urm[cuv[i]-'a'];
    return p->numar_cuvinte;
}

int lungime_prefix_comun(string cuv)
{
    nod *p=rad;
    for (unsigned int i=0; i<cuv.length(); ++i)
        if (p->urm[cuv[i]-'a']==NULL) return i;
        else p=p->urm[cuv[i]-'a'];
    return cuv.length();
}

int main()
{
    rad=new nod;
    while (f>>op>>cuv)
    {
        switch (op)
        {
            case 0: adauga(cuv);break;
            case 1: sterge(cuv);break;
            case 2: g<<numar_aparitii(cuv)<<"\n";break;
            case 3: g<<lungime_prefix_comun(cuv)<<"\n";break;
        }
    }
    f.close();
    g.close();
    return 0;
}