Cod sursa(job #322179)

Utilizator TyberFMI Dogan Adrian Ioan Lucian Tyber Data 8 iunie 2009 10:39:37
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.24 kb
#include<stdio.h>
#include<string.h>
using namespace std;
struct tnod
{
	int c,nr;
	tnod*q[30];
	tnod()
	{
		c=nr=0;
		memset(q,0,sizeof(q));
	}
};
tnod*t=new tnod;
void ins(tnod*,char*);
int del(tnod*,char*);
int que(tnod*,char*);
int pre(tnod*,char*,int);
int main()
{
	char l[30];
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	fgets(l,30,stdin);
	while(!feof(stdin))
	{
		switch(l[0])
		{
			case '0': ins(t,l+2);break;
			case '1': del(t,l+2);break;
			case '2': printf("%d\n",que(t,l+2));break;
			case '3': printf("%d\n",pre(t,l+2,0));break;
		}
		fgets(l,30,stdin);
	}
	return 0;
}
void ins(tnod*p,char*s)
{
	if(*s=='\n')
	{
		p->c++;
		return;
	}
	if(p->q[*s-'a']==0)
	{
		p->q[*s-'a']=new tnod;
		p->nr++;
	}
	ins(p->q[*s-'a'],s+1);
}
int del(tnod*p,char*s)
{
	if(*s=='\n')
		p->c--;
	else 
		if(del(p->q[*s-'a'],s+1))
		{
			p->q[*s-'a']=0;
			p->nr--;
		}
	if(p->c==0&&p->nr==0&&p!=t)
	{
		delete p;
		return 1;
	}
	return 0;
}
int que(tnod*p,char*s)
{
	if(*s=='\n')
		return p->c;
	if(p->q[*s-'a'])
		return que(p->q[*s-'a'],s+1);
	return 0;
}
int pre(tnod*p,char*s,int k)
{
	if(*s=='\n'||p->q[*s-'a']==0)
		return k;
	return pre(p->q[*s-'a'],s+1,k+1);
}