Cod sursa(job #714835)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 16 martie 2012 11:26:11
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <stdio.h>

const int dim = 26;
struct nod { 
	int c, f;
	nod *a[dim];
};

void init (nod *p)
{
	for (int i = 0; i < dim; i++)
		p->a[i] = 0;
	p->c = p->f = 0;
}

void punezero (char *p)
{
	while (*p >= 'a' && *p <= 'z')
		p++;
	*p = 0;
}

void ins (nod *n, char *p)
{
	if (*p == 0)
	{
		n->c++;
		return;
	}
	
	char c = *p - 'a';
	if (n->a[c] == 0)
	{
		n->a[c] = new nod;
		n->f ++;
		init (n->a[c]);
	}
	
	ins (n->a[c], p + 1);
}

void del (nod *n, char *p)
{
	if (*p == 0)
	{
		if (n->c == 0)
			printf ("DELETE ERROR\n");
		else
			n->c --;
		return;
	}
	
	char c = *p - 'a';
	if (n->a[c] != 0)
		del (n->a[c], p + 1);
	else
	{
		printf ("DELETE ERROR\n");
		return;
	}
	
	if (n->a[c]->c == 0 && n->a[c]->f == 0)
	{
		delete n->a[c];
		n->a[c] = 0;
		n->f --;
	}
}

void afi (nod *n, char *p)
{
	if (*p == 0)
	{
		printf ("%d\n", n->c);
		return;
	}
	
	char c = *p - 'a';
	if (n->a[c] != 0)
		afi (n->a[c], p + 1);
	else
		printf ("%d\n", 0);
}

void pre (nod *n, char *p, int k)
{
	char c = *p - 'a'; 
	if (*p == 0 || n->a[c] == 0)
	{
		printf ("%d\n", k);
		return;
	}
	pre (n->a[c], p + 1, k + 1);
}

int main ()
{
	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);
	
	int t;
	char s[dim];
	nod *R = new nod;
	init (R);
	
	while (scanf ("%d %s", &t, s) > 0)
	{
		punezero (s);
		switch (t)
		{
			case 0:
				ins (R, s);
				break;
			case 1:
				del (R, s);
				break;
			case 2:
				afi (R, s);
				break;
			case 3:
				pre (R, s, 0);
				break;
		}
		
	}
	
	return 0;
}