Cod sursa(job #1066063)

Utilizator roby2001Sirius roby2001 Data 23 decembrie 2013 23:14:06
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.73 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;
		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()
{
	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;
}