Cod sursa(job #2384545)

Utilizator victorv88Veltan Victor victorv88 Data 20 martie 2019 21:00:10
Problema Trie Scor 70
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.99 kb
#include <iostream>
#include <fstream>
#include <cstring>
using namespace std;

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

int operatie, l;
char cuv[27];

struct node{
    int nr, nr_fii;
    node *fii[28];
    node(){
        nr=0;
        nr_fii=0;
        for (int i=0; i<=26; ++i)
        {
            fii[i]=0;
        }
    }
}*root;

void adaugare(node *&nod, int ind)
{
    if (ind==l)
    {
        nod->nr++;
        return;
    }
    if (!nod->fii[cuv[ind]-'a'])
    {
        nod->fii[cuv[ind]-'a']=new node();
        nod->nr_fii++;
    }
    adaugare(nod->fii[cuv[ind]-'a'],ind+1);
    //nod->nr+=nod->fii[cuv[ind]-'a']->nr;
}

int numar_aparitii(node *nod, int ind)
{
    if (ind==l)
    {
        return nod->nr;
    }
    if (nod->fii[cuv[ind]-'a'])
        return numar_aparitii(nod->fii[cuv[ind]-'a'],ind+1);
    return 0;
}

void stergere(node *&nod, int ind)
{
    if (ind==l)
    {
        if (nod->nr)
            nod->nr--;
        if (!nod->nr_fii && !nod->nr)
        {
            nod=0;
        }
        return;
    }
    if (nod->fii[cuv[ind]-'a'])
    {
        stergere(nod->fii[cuv[ind]-'a'],ind+1);
        if (!nod->fii[cuv[ind]-'a'])
        {
            nod->nr_fii--;
            delete nod->fii[cuv[ind]-'a'];
        }
        if (nod->nr_fii==0 && nod->nr==0)
            nod=0;
    }
}

int cel_mai_lung_prefix(node *nod, int ind)
{
    if (ind==l)
    {
        return 0;
    }
    if (nod->fii[cuv[ind]-'a'])
    {
        return 1+cel_mai_lung_prefix(nod->fii[cuv[ind]-'a'],ind+1);
    }
    return 0;
}

int main() {
    root=new node();
    while (f>>operatie)
    {
        f >> cuv;
        l=strlen(cuv);
        if (operatie==0)
        {
            adaugare(root,0);
        }
        else if (operatie==2)
        {
            g << numar_aparitii(root,0) << '\n';
        }
        else if (operatie==1)
        {
            stergere(root,0);
        }
        else if (operatie==3)
        {
            g << cel_mai_lung_prefix(root,0) << '\n';
        }
    }
    return 0;
}