Cod sursa(job #2078447)

Utilizator RaduXD1Nicolae Radu RaduXD1 Data 29 noiembrie 2017 16:35:16
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <fstream>

using namespace std;
ifstream fin ("trie.in");
ofstream fout("trie.out");
int t,i,rez;
char c[30];

struct nod{
    int info;
    int ok;
    nod *fiu[26];
};

void reset(nod *lvl)
{
    lvl->ok=0;
    lvl->info=0;
    for(int i=0;i<=25;i++)
        lvl->fiu[i]=NULL;
}

void creaza(int niv, nod *lvl)
{
    if(c[niv]==0)
        return;
    int ca=c[niv]-'a';
    nod *r;
    r=lvl->fiu[ca];
    if(r==NULL)
    {
        r=new nod;
        reset(r);
        lvl->fiu[ca]=r;
    }
    r->info++;
    if(c[niv+1]==0)
        r->ok=1;
    creaza(niv+1, r);
}

void sterge(int niv, nod *lvl)
{
    if(c[niv]==0)
        return;
    int ca=c[niv]-'a';
    nod *r;
    r=lvl->fiu[ca];
    sterge(niv+1, r);
    r->info--;
    if(r->info==0)
    {
        delete r;
        lvl->fiu[ca]=NULL;
    }
}

void cauta1(int niv, nod *lvl)
{
    if(c[niv]==0)
        return;
    int ca=c[niv]-'a';
    nod *r;
    r=lvl->fiu[ca];
    if(r==NULL){
        rez=0;
        return;
    }
    if(r->ok==1)
        rez=min(rez, r->info);
    cauta1(niv+1, r);
}

void cauta2(int niv, nod *lvl)
{
    if(c[niv]==0)
        return;
    int ca=c[niv]-'a';
    nod *r;
    r=lvl->fiu[ca];
    if(r==NULL)
        return;
    if(r->info>0)
        rez=max(rez, niv+1);
    cauta2(niv+1, r);
}

int main ()
{
    nod *baza;
    baza=new nod;
    reset(baza);
    while(fin>>t)
    {
        fin>>c;
        if(t==0)
            creaza(0, baza);
        if(t==1)
            sterge(0, baza);
        if(t==2)
        {
            rez=100000000;
            cauta1(0, baza);
            if(rez==100000000)
                rez=0;
            fout<<rez<<"\n";
        }
        if(t==3)
        {
            rez=0;
            cauta2(0, baza);
            fout<<rez<<"\n";
        }
    }
    fin.close();
    fout.close();
    return 0;
}