Cod sursa(job #1087149)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 18 ianuarie 2014 23:21:13
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.7 kb
#include<fstream>
#include<iostream>
#include<cstring>
#define LGCUV 30

using namespace std;

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

int T;

struct nod
{
    int nr, fii;
    nod *urm[LGCUV];

    nod()
    {
        int i;

        nr=0; fii=0;

        for (i=0; i<27; ++i) urm[i]=NULL;
    }
}*rad;

char c[LGCUV];
int op, gata;

void Insert(nod *p)
{
    int i, lit;

    for (i=0; c[i]!='\0'; ++i)
    {
        lit=c[i]-'a';

        if (p->urm[lit] == NULL)
        {
            p->urm[lit]=new nod();
            p->fii++;
        }

        p=p->urm[lit];
    }
    p->nr++;
//    cout<<T<<"\n";
}

bool Erase(nod *p, int i)
{
    if (c[i]=='\0') --p->nr;
    else
    {
        int lit=c[i]-'a';
        if (Erase(p->urm[lit], i+1))
        {
            --p->nr; --p->fii;
        }
    }

    if (p->fii+p->nr==0)
    {
        delete p;
        return true;
    }

    return false;
}

int Tipareste_aparitii(nod *p)
{
    int i, lit;

    for (i=0; c[i]!='\0'; ++i)
    {
        lit=c[i]-'a';

        if (p->urm[lit]==NULL) return 0;
        else p=p->urm[lit];
    }

    return p->nr;
}

int Tipareste_prefix(nod *p)
{
    int i, lit;

    for (i=0; c[i]!='\0'; ++i)
    {
        lit=c[i]-'a';

        if (p->urm[lit]==NULL) return i;
        else p=p->urm[lit];
    }

    return strlen(c);
}

int main()
{
    rad=new nod;

    while (f>>op>>c)
    {
        ++T;
        if (op==0) Insert(rad);
        if (op==1) Erase(rad, 0);
        if (op==2) g<<Tipareste_aparitii(rad)<<"\n";
        if (op==3) g<<Tipareste_prefix(rad)<<"\n";
    }

    f.close();
    g.close();
    return 0;
}