Mai intai trebuie sa te autentifici.

Cod sursa(job #2553595)

Utilizator cristina-criCristina cristina-cri Data 22 februarie 2020 10:17:02
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.84 kb
#include <fstream>
#include <cstring>

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");

struct nod{
    //int prefix=0;
    int eFinal=0;
    int nrCop=0;
    nod *urm[30]={0};
};
nod *rad = new nod;

char cuv[30];
int cerinta;
int l;

void add(nod *&p, int pozInCuv)
{
    if(pozInCuv == l)
    {
        p->eFinal++;
        return ;
    }
    if(!p->urm[cuv[pozInCuv]-'a'])
        p->urm[cuv[pozInCuv]-'a']=new nod;
    p->urm[cuv[pozInCuv]-'a']->nrCop++;
    add(p->urm[cuv[pozInCuv]-'a'], pozInCuv+1);
}

void del(nod *&p, int pozInCuv)
{
    if(pozInCuv == l)
    {
        p->eFinal--;
        if(!p->eFinal && !p->nrCop)
        {
            p=0;
            delete p;
        }
        return ;
    }
    p->urm[cuv[pozInCuv]-'a']->nrCop--;
    del(p->urm[cuv[pozInCuv]-'a'], pozInCuv+1);
    if(p->nrCop==0 && p->eFinal==0 && pozInCuv!=0)
    {
        p=0;
        delete p;
    }
}

int frecv(nod *p, int pozInCuv)
{
    if(pozInCuv == l)
    {
        return p->eFinal;
    }
    if(p->urm[cuv[pozInCuv]-'a'])
        return frecv(p->urm[cuv[pozInCuv]-'a'], pozInCuv+1);
    return 0;
}

int last=0;

int pref(nod *p, int pozInCuv, int k)
{
     if(pozInCuv==l)
        return l;
    if(!p->urm[cuv[pozInCuv]-'a'] || p->urm[cuv[pozInCuv]-'a']->nrCop == 0)
        return k;
    return pref(p->urm[cuv[pozInCuv]-'a'], pozInCuv+1, k+1);
}

int main()
{
    while(f>>cerinta>>cuv)
    {
        l=strlen(cuv);
        if(cerinta == 0)
        {
            add(rad, 0);
            continue;
        }
        if(cerinta == 1)
        {
            del(rad, 0);
            continue;
        }
        if(cerinta == 2)
        {
            g<<frecv(rad, 0)<<'\n';
            continue;
        }
        g<<pref(rad, 0, 0)<<'\n';
    }

    return 0;
}