Cod sursa(job #1066599)

Utilizator roby2001Sirius roby2001 Data 25 decembrie 2013 03:58:50
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.78 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 ) 
	{
		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;
		return 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;
		return LongestPrefix(s+1,crt->next[s[0]-'a'],level+1);
	}
}

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

	return 0;
}

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

	int x;
	char s[30];


	while( fin >> x >> s )
	{

	 //   fscanf(f,"%d %s",&x,s);
		//fin >> x >> s;
		if( x == 0 )
			AddWord(s,tree);
		else  if ( x == 2 )
			//fprintf(g,"%d\n",PrintWordsNumber(s,tree));
			fout << PrintWordsNumber(s,tree) << "\n";
		else  if ( x == 3 )
			//fprintf(g,"%d\n",LongestPrefix(s,tree,0));
			fout << LongestPrefix(s,tree,0) << "\n";
		else  if  ( x == 1 )
			DeleteWord(s,tree);
	};

	return 0;
}