Cod sursa(job #308897)

Utilizator stinkyStinky si Grasa stinky Data 28 aprilie 2009 20:35:09
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<cstdio>
const int N=26;
const int L=21;

struct nod
{
	int nrvar,nrc;
	nod* fii[N];
	nod()
	{
		nrc=nrvar=0;
		for(int i=0;i<N;++i)
			fii[i]=0;
	}
};

void adaug(nod *p,char *s)
{
	++p->nrvar;
	if(*s==0)
	{
		++p->nrc;
		return;
	}
	if(p->fii[*s-'a'] == 0)
		p->fii[*s-'a'] = new nod();
	adaug(p->fii[*s-'a'],s+1);
}

nod* sterg(nod *p,char *s)
{
	--p->nrvar;
	if(*s)
		p->fii[*s-'a']=sterg(p->fii[*s-'a'],s+1);
	else
		--p->nrc;
	if(p->nrvar==0)
	{
		delete p;
		p=0;
	}
	return p;
}

int nrap(nod *p,char *s)
{
	if(*s==0)
		return p->nrc;
	if(p->fii[*s-'a']==0)
		return 0;
	return nrap(p->fii[*s-'a'],s+1);
}

int prefix(nod *p,char *s)
{
	if(*s==0)
		return 0;
	if(p->fii[*s-'a']==0)
		return 0;
	return 1+prefix(p->fii[*s-'a'],s+1);
}

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	int op;
	char s[L];
	nod *rad=0;
	while(scanf("%d %s\n",&op,s) != EOF)
	{
		//printf("rezolv operatia: %d %s\n",op,s);
		if(rad==0)
			rad=new nod;
		if(op==0)
		{
			adaug(rad,s);
			continue;
		}
		if(op==1)
		{
			rad=sterg(rad,s);
			continue;
		}
		if(op==2)
		{
			printf("%d\n",nrap(rad,s));
			continue;
		}
		if(op==3)
		{
			printf("%d\n",prefix(rad,s));
			continue;
		}
	}
	return 0;
}