Cod sursa(job #2075086)

Utilizator onescu.iancuOnescu Iancu onescu.iancu Data 25 noiembrie 2017 11:20:03
Problema Trie Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <iostream>
#include <cstdio>
#include <cstring>

#define N 22

using namespace std;

struct nod
{
    int val, nrfii=0;
    nod *fii[26];
    nod();
};

nod *root= new nod();

nod::nod()
{
    for(int i=0; i<27; i++)
        fii[i]=NULL;
    val=0;
}

char a[N], leg, k, nr;

void Add(nod *&r, int c)
{
    if(a[c]==0)
    {
        r->val++;
        return;
    }
    if(!(r->fii[a[c]-'a']))
        {
            r->fii[a[c]-'a']= new nod();
            r->nrfii++;
        }
    Add(r->fii[a[c]-'a'], c+1);
}

int Del(nod *r, int c)
{
    if(a[c] == '\0')
        r->val--;

    else if(Del(r->fii[a[c]-'a'], c+1))
    {
        r->fii[a[c]-'a']=0;
        r->nrfii--;
    }

    if(r->val == 0 && r->nrfii==0 && r!=root)
    {
        delete r;
        return 1;
    }
    return 0;
}

int Count(nod *r, int c)
{
    if(a[c] == '\0')
        return r->val;
    if(r->fii[a[c]-'a'] == NULL)
        return 0;
    return Count(r->fii[a[c]-'a'], c+1);
}

int Prefix(nod *r, int c)
{
    if(r->fii[a[c]-'a'] == NULL)
        return nr;
    else nr++;
    return Prefix(r->fii[a[c]-'a'], c+1);
}

int main()
{
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    int op;
    scanf("%d ", &op);
    cin.getline(a, N);
    while(!cin.eof())
    {
        leg=strlen(a);
        if(op==0)
            Add(root, 0);

        else if(op==1)
            Del(root, 0);

        else if(op==2)
            cout<<Count(root, 0)<<endl;

        else if(op==3)
            {
                cout<<Prefix(root, 0)<<endl;
                nr=0;
            }
        scanf("%d ", &op);
        cin.getline(a, N);
    }
    return 0;
}