Cod sursa(job #593744)

Utilizator Bit_MasterAlexandru-Iancu Caragicu Bit_Master Data 4 iunie 2011 13:23:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <cstdio>

const int S = 23;
const int ALFABET = 28;

char cuv[S];

struct trie
{
	int nr;
	trie *fiu[ALFABET];
};

trie *dex;

inline int max(int a, int b)
{
	return (a>b)?a:b;
}

inline int cod_litera (char l)
{
	return l-'a';
}

bool gol(trie *t)
{
	if (t == NULL)
		return true;
	if (t->nr > 0)
		return false;
	for (int i = 0; i < ALFABET; ++i)
		if (t->fiu[i] != NULL)
			return false;
	return true;
}

void creeaza(trie *&t)
{
	t = new trie;
	t->nr = 0;
	for (int i = 0; i < ALFABET; ++i)
		t->fiu[i] = NULL;
}

void adauga(trie *&t, char *cuv)
{
	if (t == NULL)
		creeaza(t);
	if (*cuv == 0)
		++t->nr;
	else
		adauga(t->fiu[cod_litera(*cuv)],cuv+1);
}

void sterge(trie *&t, char *cuv)
{
	if (t == NULL)
		return;
	if (*cuv == 0)
		--t->nr;
	else
		sterge(t->fiu[cod_litera(*cuv)],cuv+1);
	if (gol(t))
	{
		delete t;
		t = NULL;
	}
}

int nr(trie *&t, char *cuv)
{
	if (t == NULL)
		return 0;
	if (*cuv == 0)
		return t->nr;
	else
		return nr(t->fiu[cod_litera(*cuv)],cuv+1);
}

int l_prefix_comun(trie *&t, char *cuv, int h)
{
	if (t == NULL)
		return h-1;
	if (*cuv == 0)
		return h;
	if (t->nr > 0)
		return max(h,l_prefix_comun(t->fiu[cod_litera(*cuv)],cuv+1,h+1));
	else
		return l_prefix_comun(t->fiu[cod_litera(*cuv)],cuv+1,h+1);
}

int main()
{
	creeaza(dex);
	int nr_op;
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	
	while ((scanf("%d",&nr_op)!=EOF)&&(scanf("%s",cuv)!=EOF))
	{
		if (nr_op == 0)
			adauga(dex,cuv);
		if (nr_op == 1)
			sterge(dex,cuv);
		if (nr_op == 2)
			printf("%d\n",nr(dex,cuv));
		if (nr_op == 3)
			printf("%d\n",l_prefix_comun(dex,cuv,0));
	}
	return 0;
}