Cod sursa(job #2085682)

Utilizator xRoALexBirtoiu Alexandru xRoALex Data 10 decembrie 2017 16:04:27
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>

using namespace std;

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

struct node
{
    int cnt,n;
    node *fii[27];
    void nod()
    {
        for(int i=0;i<27;i++)
            fii[i]=NULL;
        n=cnt=0;
    }
};

string cuv;
int cer;
node *rad = new node();

void adauga(node *curent, int i)
{
    if(i == cuv.size())
    {
        curent -> cnt++;
        return;
    }
    if(curent -> fii[cuv[i]-'a'] == NULL)
    {
        curent->fii[cuv[i]-'a']=new node();
        curent -> n++;
    }
    adauga(curent -> fii[cuv[i]-'a'],i+1);
}

int sterge(node *curent, int i)
{
    if(i == cuv.size())
    {
        curent->cnt--;
    }
    else
    {
        if(sterge(curent->fii[cuv[i]-'a'],i+1))
        {
            curent->n--;
            curent->fii[cuv[i]-'a'] = NULL;
        }
    }
    if(curent != rad && curent->cnt == 0 && curent->n == 0)
    {
        delete curent;
        return 1;
    }
    return 0;
}

int aparitii(node *curent, int i)
{
    if(i==cuv.size())
        return curent->cnt;
    if(curent ->fii[cuv[i]-'a']==NULL)
        return 0;
    return aparitii(curent ->fii[cuv[i]-'a'],i+1);
}

int pref(node *curent, int i)
{
    if(curent==NULL)
        return i-1;

    if(i == cuv.size())
        return i;

    return pref(curent->fii[cuv[i]-'a'],i+1);
}

int main()
{
    while(in>>cer>>cuv)
    {
        if(cer==0)
            adauga(rad,0);
        if(cer==1)
            sterge(rad,0);
        if(cer==2)
            out << aparitii(rad,0)<<'\n';
        if(cer==3)
            out << pref(rad,0)<<'\n';
    }
    return 0;
}