Cod sursa(job #390704)

Utilizator raduzerRadu Zernoveanu raduzer Data 4 februarie 2010 13:09:54
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include <cstdio>
#include <cstring>

const int sig = 26;

struct node{
	int d, d2;
	node *f[sig];

	node()
	{
		d = d2 = 0;
		memset(f, 0, sizeof(f));
	}
};

char s[50];
int l;

void add(node *r, int x)
{
	++r->d2;

	if (x == l)
	{
		++r->d;
		return;
	}

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

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

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

void erase(node *r, int x)
{
	if (x == l)
	{
		--r->d;

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

		return;
	}

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

	node *aux = r;
	r = r->f[fiu];
	--r->d2;

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

	erase(r, x + 1);
}

int number(node *r, int x)
{
	if (x == l)
		return r->d;

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

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

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

int prefix(node *r, int x)
{
	if (x == l)
		return l;

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

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

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

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

	node *r = new node;

	while (!feof(stdin))
	{
		scanf("%d %s ", &q, s);

		l = 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));
	}
}