Cod sursa(job #1941465)

Utilizator amaliarebAmalia Rebegea amaliareb Data 27 martie 2017 12:25:46
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int n,i,j,x;
char s[25];
struct nod
{
    int nrc, nrp;
    nod *fii[26];
    nod()
    {
        nrc=nrp=0;
        for(int i=0;i<26;i++) fii[i]=NULL;
    }
};
nod *root=NULL;

nod *adauga(nod *p, char *s)
{
    if(p==NULL)
    {
        p=new nod;
    }
    (p->nrp)++;
    if(s[0]!='\0')
    {
        p->fii[s[0]-'a']=adauga(p->fii[s[0]-'a'],s+1);
    }
    else
    {
        p->nrc++;
    }
    return p;
}

int vcuv(nod *p, char *s)
{
    if(p==NULL) return 0;
    if(s[0]=='\0')
    {
        return p->nrc;
    }
    else
    {
        return vcuv(p->fii[s[0]-'a'],s+1);
    }
}

int vpref(nod *p, char *s, int lungime)
{
    if(s[0]=='\0')
    {
        return lungime-1;
    }
    else
    {
        if(p==NULL) return lungime-1;
        else vpref(p->fii[s[0]-'a'],s+1,lungime+1);
    }
}

nod *sterge(nod *p, char *s)
{
    if(s[0]==0) p->nrc--;
    else
    {
        p->fii[s[0]-'a']=sterge(p->fii[s[0]-'a'],s+1);
    }
    p->nrp--;
    if(p->nrp==0)
    {
        delete p;
        p=NULL;
    }
    return p;
}

int main()
{
    while(f>>x)
    {
        f.get();
        f.getline(s,25);
        if(x==0) root = adauga(root,s);
        else if(x==1) sterge(root,s);
        else if(x==2) g<<vcuv(root,s)<<'\n';
        else if(x==3) g<<vpref(root,s,0)<<'\n';
    }
    return 0;
}