Cod sursa(job #402419)

Utilizator andrei.sfrentSfrent Andrei andrei.sfrent Data 23 februarie 2010 20:55:27
Problema Trie Scor 65
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CARD_SIGMA ('Z' - 'A' + 1)

struct nod
{
	nod* fii[CARD_SIGMA];
	int nrcuv; //numar de cuvinte care se termina pe aceasta pozitie
	int nrfii; //numar de cuvinte care continua din aceasta pozitie

	nod()
	{
		int i;
		for(i = 0; i < CARD_SIGMA; ++i) fii[i] = NULL;
		nrcuv = nrfii = 0;
	}
};

nod* radacina;

void adaugaCuvant(nod* trie, char* s)
{
	if(*s == '\0')
	{
		trie -> nrcuv++;
	}
	else
	{
		if(trie -> fii[*s - 'a'] == NULL)
			trie -> fii[*s - 'a'] = new nod;
		adaugaCuvant(trie -> fii[*s - 'a'], s + 1);
		trie -> nrfii++;
	}
}

int stergeCuvant(nod* trie, char* s)
{
	if( *s == '\0') trie -> nrcuv--;
	else if(stergeCuvant(trie -> fii[*s - 'a'], s + 1))
	{
		trie -> nrfii--;
		trie -> fii[*s - 'a'] = NULL;
	}
	if(trie -> nrcuv == 0 && trie -> nrfii == 0 && trie != radacina)
	{
		delete trie;
		return 1;
	}
	return 0;
}

int aparitii(nod* trie, char* s)
{
	if(*s == '\0') return trie -> nrcuv;
	else
	{
		if(trie -> fii[*s - 'a'] == NULL) return 0;
		else return aparitii(trie -> fii[*s - 'a'], s + 1);
	}
}

int prefix(nod* trie, char* s)
{
	if(*s == '\0' || trie -> fii[*s - 'a'] == NULL) return 0;
	return prefix(trie -> fii[*s - 'a'], s + 1) + 1;
	return 0;
}

int main()
{
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	
	char s[50];
	int codOp;

	radacina = new nod;
	while(!feof(stdin))
	{
		scanf("%d%s\n", &codOp, s);
		if(codOp == 0) adaugaCuvant(radacina, s);
		if(codOp == 1) stergeCuvant(radacina, s);
		if(codOp == 2) printf("%d\n", aparitii(radacina, s));
		if(codOp == 3) printf("%d\n", prefix(radacina, s));
	}

	return 0;
}