Cod sursa(job #1066598)

Utilizator roby2001Sirius roby2001 Data 25 decembrie 2013 03:46:22
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.84 kb
/*
    Keep It Simple!
*/
 
#include<fstream>
#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 || *s == '\n' ) 
	{
		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 || *s == '\n' )
		return crt -> v;
	else
	{
		if(!crt->next[s[0]-'a'])
			return 0;
		return PrintWordsNumber(s+1,crt->next[s[0]-'a']);
	}
}

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

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

int main()
{
	//std::ifstream fin("trie.in");
	//std::ofstream fout("trie.out");
	//FILE *f = fopen("trie.in","r");
	//FILE *g = fopen("trie.out","w");

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

	int x;
	char s[30];


	//while( fin >> x >> s )
	do
	{

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

	return 0;
}