Cod sursa(job #2082807)

Utilizator LauraNaduLaura Nadu LauraNadu Data 6 decembrie 2017 19:48:23
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<fstream>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
    int fii;
    int nr;
    trie *fr[26];
    trie()
    {
        fii=nr=0;
        for(int i=0;i<26;i++)
            fr[i]=0;
    }
};
trie *root=new trie;
int n;
char a[25];
void adauga(trie *r, char *s)
{
    if(*s==0)
        r->nr ++;
    else
    {
        if(r->fr[*s-'a'] ==0)
        {
            r->fii ++;
            r->fr[*s-'a'] =new trie;
        }
        adauga(r->fr[*s-'a'], s+1);
    }
}
void sterge(trie *&r, char *s)
{
    if(*s==0)
    {
        r->nr --;
        if(r->nr==0 && r->fii==0)
        {
            delete r;
            r=NULL; //motivul pt care punem &r
        }
    }
    else
    {
        sterge(r->fr[*s-'a'], s+1);
        if(r->fr[*s-'a'] ==0) //daca mai are fii ??? //DACA *s ESTE FIU !!!
            r->fii --;       // ...                 //aici scazi numarul de fii in caz ca ala nu e ^^
        if(r->nr==0 && r->fii==0 && r!=root) //nu sterge radacina
        {
            delete r;
            r=NULL;
        }
    }
}
int numara(trie *r, char *s)
{
    if(*s==0)
        return r->nr;
    if(r->fr[*s-'a'] ==0)
        return 0;
    return numara(r->fr[*s-'a'], s+1);
}
int lungime(trie *r, char *s)
{
    if(*s==0 || r->fr[*s-'a']==0)
        return 0;
    return 1+lungime(r->fr[*s-'a'], s+1);
}
int main()
{
    while(f>>n)
    {
        f>>a;
        if(n==0)
            adauga(root, a);
        if(n==1)
            sterge(root, a);
        if(n==2)
            g<<numara(root, a)<<"\n";
        if(n==3)
            g<<lungime(root, a)<<"\n";
    }
    return 0;
}