Cod sursa(job #770763)

Utilizator test9cosmin Macovei test9 Data 23 iulie 2012 20:21:10
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.59 kb
#include <fstream>
#include <cstring>
using namespace std;

struct Trie
{
	int fii,ap;
	Trie *fiu[26];
	
	Trie()
	{
		fii=ap=0;
		memset(fiu,0,sizeof(fiu));
	}
};

ifstream in("trie.in");
ofstream out("trie.out");

Trie *A=new Trie;
char a[50];
int ltt=0,ok=1;

void ins(Trie *nod,char *s)
{
	if(*s=='\n')
	{
		nod->ap++;
		return;
	}
	
	if(nod->fiu[*s-'a']==0)
	{	
		nod->fiu[*s-'a']=new Trie;
		nod->fii++;
	}
	
	ins(nod->fiu[*s-'a'],s+1);
}

/*void del(Trie *nod,char *s)
{
	if(*s=='\n')
	{
		nod->ap--;
		if(nod->fii || nod->ap) ok=0;
		return;
	}
	
	if(nod->fiu[*s-'a'])
	{
		del(nod->fiu[*s-'a'],s+1);
	}
	
	if(ok)
	{
		if(nod->fii>1 || nod->ap>0)
		{
			nod->fiu[*s-'a']=0;
			ok=0;
		}
	}
}*/

int del( Trie *nod, char *s )
{
	if( *s == '\n' )
	{
		nod->ap --;
	}
	else
	if( del( nod->fiu[ *s-'a' ], s+1 ) ) {
		nod->fiu[ *s-'a' ] = 0;
		nod->fii --;
	}
	 
	if( nod->ap == 0 && nod->fii == 0 && nod != A )
	{
		delete nod; return 1;
	}
	
	return 0;
}

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

int trei(Trie *nod,char *s,int lvl)
{
	if(*s=='\n')
	{
		return lvl;
	}
	
	if(nod->fiu[*s-'a'])
	{
		return trei(nod->fiu[*s-'a'],s+1,lvl+1);	
	}
	else
	{
		return lvl;
	}
}

int main()
{
	
	while(in.getline(a,49))
	{
		a[strlen(a)]='\n';
		//out<<a;
		if(a[0]=='0')
		{
			ins(A,a+2);
		}
		else
		if(a[0]=='1')
		{
		 	ok=1;
			del(A,a+2);
		}
		else
		if(a[0]=='2')
		{
			out<<doi(A,a+2)<<'\n';
		}
		else
		if(a[0]=='3')
		{
			out<<trei(A,a+2,0)<<'\n';
		}
		memset(a,'\0',sizeof(a));
	}
	
	out.close();
	return 0;
}