Cod sursa(job #338990)

Utilizator ilincaSorescu Ilinca ilinca Data 7 august 2009 18:15:31
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 2.09 kb
#include <stdio.h> 

#define cmax 25
#define lmax 30


struct trie 
{
	int nra; //numar de aparitii
	trie *nod [lmax];
};

char *p;
trie *first;


trie * init ()
{
	int i;
	trie *aux=new trie;
	aux->nra=0;
	for (i=0; i <= 26; ++i) 
		aux->nod [i]=NULL;
	return aux;
}

void f0 ()
{
	trie *aux;
	//fprintf(stderr, "%d\n", first->nra); 
	aux=first;
	while ((*p) >= 'a' && (*p) <= 'z') 
	{
		if (aux->nod [(*p)-'a'] == NULL) 
		{
			aux->nod [(*p)-'a']=init ();
		}
		aux=aux->nod [(*p)-'a'];
		++p;
	//	fprintf(stderr, "%c", (*p) ); 
	}
	//fprintf(stderr, "\nok!" ); 
	++aux->nra;
}

bool exista (trie *ceva, int x)
{
	int i;
	for (i=0; i <= 26; ++i) 
		if (i != x && ceva->nod [i] != NULL) 
			return true;
	return false;
}

void f1 ()
{
	trie *aux, *tata [100005];
	int num=0;
	aux=first;
	tata [++num]=first;
	while ((*p) >= 'a' && (*p) <= 'z') 
	{
		aux=aux->nod [(*p)-'a'];
		tata [++num]=aux;
		++p;
	}
	--aux->nra;
	if (aux->nra != 0) return;
	if (exista (tata [num], -1)) return;
	do 
	{
		--p;
		delete tata [num];
		tata [num-1]->nod [(*p)-'a']=NULL;
	//	fprintf(stderr, "num=%d\n",num ); 
	} while ((num > 1) && (!exista (tata [--num], -1))); 
}

int f2 ()
{
	trie *aux;
	aux=first;
	while ((*p) >= 'a' && (*p) <= 'z') 
	{
		if (aux->nod [(*p)-'a'] == NULL) 
			return 0;
		aux=aux->nod [(*p)-'a'];
		++p;
	}
	return aux->nra;
}

int f3 ()
{
	trie *aux;
	int i, nl=0, r=0;
	aux=first;
	while ((*p) >= 'a' && (*p) <= 'z')
	{
		++nl;
		if (aux->nod [(*p)-'a'] == NULL) 
			return nl-1;
		if (exista (aux, (*p)-'a')) r=nl;
		aux=aux->nod [(*p)-'a'];
		//fprintf(stderr, "(*p)=%c\n", (*p) ); 
		++p;
	}
//	fprintf(stderr, "ok!" ); 	
//	for (i=0; i <= 26; ++i) 
//		if (aux->nod [i] != NULL) 
//			r=nl;
	if (aux->nra || exista (aux, -1)) return nl;
	return r;

}

int main ()
{
	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);
	char a [cmax+10];
	first=init ();
	while (gets (a) != NULL)
	{
		p=a+2;
		if (a [0] == '0') 
		{
			f0 ();
			continue;
		}
		if (a [0] == '1') 
		{
			f1 ();
			continue;
		}
		if (a [0] == '2')
		{
			printf ("%d\n", f2 ());
			continue;
		}
		printf ("%d\n", f3 ());
	}	
	return 0;
}