Cod sursa(job #601999)

Utilizator PlayLikeNeverB4George Marcus PlayLikeNeverB4 Data 8 iulie 2011 17:39:21
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <algorithm>

struct Trie {
	int nr, nrfii;
	Trie *fiu[30];
	
	Trie()
	{
		nr=nrfii=0;
		memset( fiu, 0, sizeof(fiu) );
	}
};

Trie *T;
char s[30];

void add(Trie *nod, char *c)
{
	if(*c == '\n')
	{
		nod->nr++;
		return;
	}
	
	if(nod->fiu[*c-'a']==0)
	{
		nod->fiu[*c-'a']=new Trie;
		nod->nrfii++;
	}
	add(nod->fiu[*c-'a'], c+1);
}

int del(Trie *nod, char *c)
{
	if(*c == '\n')
		nod->nr--;
	else if( del ( nod->fiu[*c-'a'], c+1) )
	{
		nod->fiu[*c-'a']=0;
		nod->nrfii--;
	}
	if( nod->nr == 0 && nod-> nrfii == 0 && nod != T )
	{	
		delete nod; return 1;
	}

	return 0;
}

int ap(Trie *nod, char *c)
{
	if(*c == '\n')
		return nod->nr;
	
	if( nod->fiu[*c-'a'] )
		return ap(nod->fiu[*c-'a'],c+1);
	return 0;
}

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

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	
	T = new Trie;
	fgets(s,sizeof(s),stdin);
	
	while( !feof(stdin) )
	{
		switch( s[0] )
		{
			case '0': add(T,s+2); break;
			case '1': del(T,s+2); break;
			case '2': printf("%d\n",ap(T,s+2)); break;
			case '3': printf("%d\n",pref(T,s+2)); break;
		}
		
		fgets(s,sizeof(s),stdin);
	}
	
}