Cod sursa(job #2628937)

Utilizator Gandalf29Demeter Csaba Gandalf29 Data 18 iunie 2020 12:18:57
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
//#include <iostream>
#include <fstream>
#include <string>
#include <vector>

using namespace std;
ifstream cin ("trie.in");
ofstream cout ("trie.out");
struct adat
{
    int sz,veg;
    adat* kov[27];
};

adat* start;

string k;

void betesz (adat*&s, string k)
{
    int p,i;
    p=int(k[0]-'a');
    if(s==NULL)
    {
        s=new adat;
        s->sz=0;
        s->veg=0;
        for(i=0;i<=26;++i) s->kov[i]=NULL;
        if(k.length()==0) s->veg++;
        else
        {
            s->sz++;
            betesz(s->kov[p],k.substr(1,k.length()));
        }
    }
    else
    {
        if(k.length()==0) s->veg++;
        else
        {
            s->sz++;
            betesz(s->kov[p],k.substr(1,k.length()));
        }
    }

}

int torol (adat*&s,string k)
{
    int p=k[0]-'a',i;
    if(s!=NULL)
    {
        s->sz--;
        if(s->sz==0)
        {
            for(i=0;i<=26;++i)
            {
                delete s->kov[i];
                s->kov[i]=NULL;
            }
        }
        else
        if(k.length()==0)
        {
            s->veg--;
            if(s->veg==0)
            {
                delete s;
                s=NULL;
            }
        }
        else torol(s->kov[p],k.substr(1,k.length()));
    }
}
/*
int kiir (adat*&s)
{
    adat*p=s;
    while (p)
    {
        cout<<p->x<<" ";
        p=p->kov;
    }
}*/

int szo(adat*s,string k)
{
    if(k.length()==0) return s->veg;
    else return szo(s->kov[k[0]-'a'],k.substr(1,k.length()));
}

int prefix(adat*s,string k)
{
    int p=k[0]-'a';
    if(s->kov[p]==NULL) return 0;
    else return 1+prefix(s->kov[k[0]-'a'],k.substr(1,k.length()));
}


long long i,n,a;

int main()
{
    int db=0;
    start=NULL;
    while (cin>>a>>k)
    {
        if(a==0) betesz(start,k);
        if(a==1) torol(start,k);
        if(a==2)
            cout<<szo(start,k)<<"\n";
        if(a==3) cout<<prefix(start,k)<<"\n";
    }
    //torolel(start);
    //kiir(start);

    return 0;
}