Cod sursa(job #1066041)

Utilizator roby2001Sirius roby2001 Data 23 decembrie 2013 22:54:57
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.55 kb
/*
    Keep It Simple!
*/
 

#include<stdio.h>
#include<string.h>



struct node
{
	int v,nr;
	node *next[30];

	node() 
	{
		nr = v = 0;
		memset(next,0,sizeof(next));
	}
};

node *tree = new node;

void AddWord( char *s, node* crt )
{
	if ( s[0] == 0 ) 
	{
		crt->v++;
		return;
	}
	else
	{
		if(!crt->next[s[0]-'a'])
		{
			crt->next[s[0]-'a'] = new node;
			crt->nr++;
		}
		AddWord(s+1,crt->next[s[0]-'a']);
	}

}

int PrintWordsNumber( char *s, node* crt )
{
	if ( s[0] == 0 )
		return crt -> v;
	else
	{
		if(!crt->next[s[0]-'a'])
			return 0;
		PrintWordsNumber(s+1,crt->next[s[0]-'a']);
	}
}

int LongestPrefix( char *s, node* crt, int level )
{
	if ( s[0] == 0 )
		return level;
	else
	{
		if(!crt->next[s[0]-'a'])
			return level;
		LongestPrefix(s+1,crt->next[s[0]-'a'],level+1);
	}
}

void DeleteWord( char *s, node* crt)
{
	if ( s[0] == 0 )
	{
		crt -> v--;
		return;
	}
	else
	{
		if(!crt->next[s[0]-'a'])
			return;
		DeleteWord(s+1,crt->next[s[0]-'a']);
        

		if(crt->next[s[0]-'a']->nr == 0 && crt->next[s[0]-'a']->v == 0)
			 crt->next[s[0]-'a'] = NULL;
	}
}

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);

	int x;
	char s[30];


	do
	{

	    scanf("%d %s",&x,s);
		
		if( x == 0 )
			AddWord(s,tree);
		else  if ( x == 2 )
			printf("%d\n",PrintWordsNumber(s,tree));
		else  if ( x == 3 )
			printf("%d\n",LongestPrefix(s,tree,0));
		else  if  ( x == 1 )
			DeleteWord(s,tree);
	}while( !feof(stdin) );

	return 0;
}