Cod sursa(job #635062)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 18 noiembrie 2011 13:15:24
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <stdio.h>

const int dim = 26;
char S[dim];
struct nod {
	nod *a[dim];
	int fii, nr;
} *R;

void init (nod *&p)
{
	p = new nod;
	p->fii = p->nr = 0;
	for (int i = 0; i < dim; i++)
		p->a[i] = NULL;
}

void cit ()
{
	fgets (S, dim, stdin);
	for (int i = 2; S[i] != '\n'; i++)
		S[i] -= 'a';
}

void ins (nod *p, char *s)
{
	if (*s == '\n')
	{
		p->nr ++;
		return;
	}
	if (p->a[*s] == NULL)
	{
		p->fii ++;
		init (p->a[*s]);
	}
	ins (p->a[*s], s+1);
}

void del (nod *p, char *s)
{
	if (*s == '\n')
	{
		p->nr --;
		return;
	}
	del (p->a[*s], s+1);
	if (p->a[*s]->nr == 0 && p->a[*s]->fii == 0)
	{
		delete p->a[*s];
		p->a[*s] = NULL;
	}			
}

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

void pre (nod *p, char *s)
{
	if (*s == '\n' || p->a[*s] == NULL)
	{
		printf ("%d\n", s-S-2);
		return;
	}
	pre (p->a[*s], s+1);
}

int main ()
{
	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);
	
	init (R);
	cit ();
	while ( !feof (stdin) )
	{
		switch (S[0])
		{
			case '0': ins (R, S+2); break;
			case '1': del (R, S+2); break;
			case '2': afi (R, S+2); break;
			case '3': pre (R, S+2); break;
		}		
		cit ();
	}
	
	return 0;
}