Cod sursa(job #1260267)

Utilizator deresurobertoFMI - Deresu Roberto deresuroberto Data 11 noiembrie 2014 02:32:01
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
//Roberto Deresu - FMI
//Re :)
#include<cstdio>
#include<cstring>
using namespace std;
int n,i,tip;
char s[27];

struct nod
{
    int nr;
    int nr_fii;
    nod *fii[26];
    nod *tata;

    nod()
    {
        nr = 0;
        nr_fii = 0;
        tata = 0;
        memset(fii,0,sizeof(fii));
    }
};

nod *rad = new nod;


void Adauga(nod *nod_curent, char *s)
{
    if(*s == 0)
    {
        nod_curent -> nr++;
        return;
    }

    if(!nod_curent -> fii[*s-'a'])
    {
        nod_curent -> fii[*s-'a'] = new nod;
        nod_curent -> fii[*s-'a'] -> tata = nod_curent;
        nod_curent -> nr_fii++;
    }

    Adauga(nod_curent -> fii[*s-'a'], s+1);
}

void Sterge(nod *nod_curent, char *s)
{
    if(*s == 0) nod_curent -> nr--;
    else Sterge(nod_curent -> fii[*s-'a'], s+1);

    if(nod_curent != rad && nod_curent -> nr_fii == 0 && nod_curent -> nr == 0)
    {
        nod_curent -> tata -> nr_fii--;
        nod_curent -> tata -> fii[*(s-1)-'a'] = 0;
        delete nod_curent;
    }
}


int Numar_aparitii(nod *nod_curent,char *s)
{
    if(*s == 0) return nod_curent -> nr;

    if(!nod_curent -> fii[*s-'a']) return 0;

    return Numar_aparitii(nod_curent -> fii[*s-'a'], s+1);
}


int Lungime_prefix(nod *nod_curent, char *s, int pas)
{
    if(*s == 0 || !nod_curent -> fii[*s-'a']) return pas;

    return Lungime_prefix(nod_curent -> fii[*s-'a'], s+1, pas+1);
}

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);

	while(scanf("%d %s",&tip,s) != EOF)
	{

	    if(tip == 0) Adauga(rad, s);
	    else
	    if(tip == 1) Sterge(rad, s);
	    else
	    if(tip == 2) printf("%d\n", Numar_aparitii(rad, s));
	    else
	    if(tip == 3) printf("%d\n", Lungime_prefix(rad, s, 0));
	}

	return 0;
}