Cod sursa(job #2628942)

Utilizator Gandalf29Demeter Csaba Gandalf29 Data 18 iunie 2020 12:27:42
Problema Trie Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.96 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[26];
};

adat* start;

string k;

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

}

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

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

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


long long i,n,a;

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

    return 0;
}