Cod sursa(job #634821)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 17 noiembrie 2011 13:16:12
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.23 kb
#include <stdio.h>

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

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

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

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

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

void prefix (nod *p, char *s, int k)
{
	
	prefix (k+1);
}

int main ()
{
	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);
	
	init (R);
	
	fgets (S, 26, stdin);
	while ( !feof(stdin) )
	{
		for (int i = 2; S[i] != '\n'; i++)
			S[i] -= 'a';
		switch (S[0])
		{
			case '0': insert (R, S+2); break;
			case '1': delet (R, S+2); break;
			case '2': aparitii (R, S+2); break;
		}
		fgets (S, 26, stdin);		
	}
	
	return 0;
}