Cod sursa(job #1585841)

Utilizator TibixbAndrei Tiberiu Tibixb Data 31 ianuarie 2016 15:31:52
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include<fstream>
using namespace std;
int op;
char s[22];
struct nod
{
    int nr;
    int nf;
    nod *F[26];
    nod()
    {
        nr=0;
        nf=0;
        for(int i=0; i<25; i++)
        {
            F[i]=0;
        }
    }
};
nod *rad;
void inserare(nod *p, char *s)
{
    if(*s!=0)
    {
        if(p->F[*s-'a']==NULL)
        {
            p->F[*s-'a']=new nod;
            p->nf++;
        }
        inserare(p->F[*s-'a'], s+1);
    }else
    {
        p->nr++;
    }
}
int aparitii(nod *p, char *s)
{
    if(*s==0)
    {
        return p->nr;
    }
    if(p->F[*s-'a']==NULL)
        return 0;
    return aparitii(p->F[*s-'a'], s+1);
}
int prefix(nod *p, char *s)
{
    if(*s==0)
    {
        return 0;
    }
    if(p->F[*s-'a']==NULL)
        return 0;
    return 1+prefix(p->F[*s-'a'], s+1);
}
int sterge(nod *p, char *s)
{
    if(*s==0)
    {
        p->nr--;
        if(p->nr==0 && p->nf==0)
        {
            delete p;
            return 1;
        }
        return 0;
    }
    if(p->F[*s-'a']==NULL)
        return 0;
    if(sterge(p->F[*s-'a'], s+1)==0)
        return 0;
    p->F[*s-'a']=NULL;
    p->nf--;
    if(p->nr==0 && p->nf==0 && p!=rad)
    {
        delete p;
        return 1;
    }
    return 0;
}
ifstream in("trie.in");
ofstream out("trie.out");
int main()
{
    rad=new nod;
    while(in>>op)
    {
        in>>s;
        if(op==0)
        {
            inserare(rad, s);
            continue;
        }
        if(op==1)
        {
            sterge(rad, s);
            continue;
        }
        if(op==2)
        {
            out<<aparitii(rad, s)<<"\n";
            continue;
        }
        if(op==3)
        {
            out<<prefix(rad, s)<<"\n";
            continue;
        }
    }
    return 0;
}