Cod sursa(job #485334)

Utilizator raduzerRadu Zernoveanu raduzer Data 18 septembrie 2010 09:27:42
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <cstdio>
#include <cstring>

const int sigma = 26;

struct nod{
	int drum, nr;
	nod *f[sigma];

	nod()
	{
		drum = nr = 0;
		memset(f, 0, sizeof(f));
	}
};

char s[22];
int len;

void add(nod *r, int i)
{
	++r->drum;

	if (i == len)
	{
		++r->nr;
		return;
	}

	int fiu = s[i] - 'a';

	if (r->f[fiu] == NULL)
		r->f[fiu] = new nod;

	add(r->f[fiu], i + 1);
}

void erase(nod *r, int i)
{
	--r->drum;

	if (i == len)
	{
		--r->nr;

		if (r->drum == 0)
			delete r;

		return;
	}

	int fiu = s[i] - 'a';

	nod *aux = r;
	r = r->f[fiu];

	if (aux->drum == 0)
		delete aux;
	else if (r->drum == 1)
		aux->f[fiu] = NULL;

	erase(r, i + 1);
}

int number(nod *r, int i)
{
	if (i == len)
		return r->nr;

	int fiu = s[i] - 'a';

	if (r->f[fiu] == NULL)
		return 0;

	return number(r->f[fiu], i + 1);
}

int prefix(nod *r, int i)
{
	if (i == len)
		return i;

	int fiu = s[i] - 'a';

	if (r->f[fiu] == NULL)
		return i;

	return prefix(r->f[fiu], i + 1);
}

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

	nod *r = new nod;

	while (!feof(stdin))
	{
		int q;

		scanf("%d %s ", &q, s);

		len = strlen(s);

		if (q == 0)
			add(r, 0);
		if (q == 1)
			erase(r, 0);
		if (q == 2)
			printf("%d\n", number(r, 0));
		if (q == 3)
			printf("%d\n", prefix(r, 0));
	}
}