Cod sursa(job #1385737)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 12 martie 2015 11:56:34
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
#include <fstream>
#include <cstring>
#define CH (s[i]-'a')
using namespace std;

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

struct Trie
{
    int info, nrfii;
    Trie* fiu[26];

    Trie()
    {
        info = nrfii = 0;
        memset(fiu, 0, sizeof(fiu));
    }
} *prim;
char s[25];
int lg;

void adauga(Trie* nod, int i)
{
    if(s[i] == '\0')
    {
        nod->info++;
        return;
    }

    if(nod->fiu[ CH ] == 0)
    {
        nod->fiu[ CH ] = new Trie;
        nod->nrfii++;
    }

    adauga(nod->fiu[ CH ], i+1);
}

int sterge(Trie* nod, int i)
{
    if(s[i] == '\0')
    {
        nod->info--;
    }
    else
    if( sterge(nod->fiu[ CH ], i+1) )
    {
        nod->fiu[ CH ] = 0;
        nod->nrfii--;
    }

    if(nod->info==0 && nod->nrfii==0 && nod!=prim)
    {
        delete nod;
        return 1;
    }

    return 0;
}

int nr_apar(Trie* nod, int i)
{
    if(s[i] == '\0')
    {
        return nod->info;
    }

    return nr_apar(nod->fiu[ CH ], i+1);
}

int nr_pref(Trie* nod, int i, int k)
{
    if(s[i] == '\0' || nod->fiu[ CH ] == 0)
    {
        return k;
    }

    return nr_pref(nod->fiu[ CH ], i+1, k+1);
}

int main()
{
    prim = new Trie;
    int tip;

    while(fin>>tip>>s)
    {
        lg = strlen(s);
        switch(tip)
        {
            case 0: adauga(prim, 0); break;
            case 1: sterge(prim, 0); break;
            case 2: fout<<nr_apar(prim, 0)<<'\n'; break;
            case 3: fout<<nr_pref(prim, 0, 0)<<'\n'; break;
        }
        fin.get();
    }

    fin.close(); fout.close();
    return 0;
}