Cod sursa(job #770460)

Utilizator test9cosmin Macovei test9 Data 23 iulie 2012 09:58:11
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 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));
	}
};

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

void ins(Trie *nod,char *s)
{
	if(*s=='\n')
	{
		nod->ap++;
		if(nod->ap==0)
		{
			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->ap==0)
		{
			nod->ap--;
		}
		return;
	}
	
	if(nod->fiu[*s-'a'])
	{
		del(nod->fiu[*s-'a'],s+1);
	}
}

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'] && (nod->fiu[*s-'a'])->ap!=-1)
	{
		return trei(nod->fiu[*s-'a'],s+1,lvl+1);	
	}
	else
	{
		return lvl;
	}
}

int main()
{
	ifstream in("trie.in");
	ofstream out("trie.out");
	
	while(in.getline(a,49))
	{
		a[strlen(a)]='\n';
		//out<<a;
		if(a[0]=='0')
		{
			ins(A,a+2);
		}
		else
		if(a[0]=='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;
}