Cod sursa(job #339110)

Utilizator ilincaSorescu Ilinca ilinca Data 8 august 2009 12:18:49
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <stdio.h> 
#include <string.h> 


struct Trie 
{
	int nrfii, nra;
	Trie *fiu [27];

	Trie ()
	{
		nrfii=nra=0;
		memset (fiu, 0, sizeof (fiu));
	}
};

Trie *t=new Trie;


void f0 (Trie *k, char *p)
{
	if ((*p) == '\n') 
		++k->nra;
	else
	{
		if (k->fiu [(*p)-'a'] == 0) 
		{
			k->fiu [(*p)-'a']=new Trie;
			++k->nrfii;
		}
		f0 (k->fiu [(*p)-'a'], p+1);
	}
}

int f1 (Trie *k, char *p)
{
	if ((*p) == '\n')
	       --k->nra;
	else
		if (f1 (k->fiu [(*p)-'a'], p+1)) 
		{
			--k->nrfii;
			k->fiu [(*p)-'a']=0;
		}	
	if (k->nrfii == 0 && k->nra == 0 && k != t) 
	{
		delete k;
		return 1;
	}
	return 0;
}

int f2 (Trie *k, char *p)
{
	if ((*p) == '\n') 
		return k->nra;
	return f2 (k->fiu [(*p)-'a'], p+1);
}

int f3 (Trie *k, char *p, int pref)
{
	if ((*p) == '\n' || k->fiu [(*p)-'a'] == 0)
	       return pref;	
	return f3 (k->fiu [(*p)-'a'], p+1, pref+1);
}

int main ()
{
	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);
	char a [65];
	while (fgets (a, sizeof (a), stdin)) 
	{
		switch (a [0])
		{
			case '0': f0 (t, a+2); break;
			case '1': f1 (t, a+2); break;
			case '2': printf ("%d\n", f2 (t, a+2));	break;
			case '3': printf ("%d\n", f3 (t, a+2, 0)); break;	 
		} 
	}
	return 0;
}