Cod sursa(job #428544)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 29 martie 2010 12:48:34
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include<stdio.h>
#define Nmax 22
char s[Nmax];
int op;

struct nod
{
	int nrc,nrf;
	nod *fiu[30];
}*rad,*p;

void parcurg(nod *p,char poz)
{
	
	if(p)
	{
	if(p!=rad)	printf("%c ",poz);
		for(int i=0;i<26;i++)
			parcurg(p->fiu[i],i+'a');
	}
}
void init(nod *p)
{
	p->nrc=0;
	p->nrf=0;
	for(int i=0;i<26;i++)
		p->fiu[i]=NULL;
}
void adauga(nod *c,char s[],int poz)
{
	
	if(s[poz]!='\n')
	{
		if(c->fiu[s[poz]-'a']==NULL)
		{
			p=new nod;
			init(p);
			c->nrf++;
			c->fiu[s[poz]-'a']=p;
			
		}
		adauga(c->fiu[s[poz]-'a'],s,poz+1);
	}
	else
		c->nrc++;
}

int aparitii(nod *c,char s[],int poz)
{
	
	if(s[poz]=='\n')
		return c->nrc;
	else
		if(c->fiu[s[poz]-'a'])
			return aparitii(c->fiu[s[poz]-'a'],s,poz+1);
		else
			return 0;
}

void sterge(nod *c,char s[],int poz)
{
	if(s[poz]!='\n')
	{	sterge(c->fiu[s[poz]-'a'],s,poz+1);
		if(c->fiu[s[poz]-'a']->nrc==0 && c->fiu[s[poz]-'a']->nrf==0 && c!=rad)
		{
			c->nrf--;
			c->fiu[s[poz]-'a']=NULL;
			delete c->fiu[s[poz]-'a'];
		}
	}
	else
		c->nrc--;

}

int prefix(nod *c,char s[],int poz)
{
	if(c->fiu[s[poz]-'a'] && s[poz]!='\n')
		return prefix(c->fiu[s[poz]-'a'],s,poz+1);
	else	return poz;
}

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	rad=new nod;
	init(rad);
	while(!feof(stdin))
	{
		fgets(s,Nmax,stdin);
		op=s[0]-'0';
		switch(op)
		{
		case 0:adauga(rad,s+2,0);break;
		case 1:sterge(rad,s+2,0);break;
		case 2:printf("%d\n",aparitii(rad,s+2,0));break;
		case 3:printf("%d\n",prefix(rad,s+2,0));break;
		}
	}
	//parcurg(rad,'*');
	return 0;
}