Cod sursa(job #428444)

Utilizator Andrei_ScorpioAndreiana Andrei Daniel Andrei_Scorpio Data 29 martie 2010 11:49:28
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<stdio.h>
#define Nmax 22
char s[Nmax];
int op;

struct nod
{
	int nrc,nrf;
	nod *fiu[26];
}*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]!='\0')
	{
		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]=='\0')
		return c->nrc;
	return aparitii(c->fiu[s[poz]-'a'],s,poz+1);
}

void sterge(nod *c,char s[],int poz)
{
	if(s[poz]!='\0')
	{	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->nrf--;
			delete c->fiu[s[poz]-'a'];
			c->fiu[s[poz]-'a']=NULL;
		}
	}
	else
		c->nrc--;

}

int prefix(nod *c,char s[],int poz)
{
	if(c->fiu[s[poz]-'a'] && s[poz]!='\0')
		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);
	rad->nrc=1;
	while(!feof(stdin))
	{
		scanf("%d %s",&op,s);
		switch(op)
		{
		case 0:adauga(rad,s,0);break;
		case 1:sterge(rad,s,0);break;
		case 2:printf("%d\n",aparitii(rad,s,0));break;
		case 3:printf("%d\n",prefix(rad,s,0));break;
		}
	}
	//parcurg(rad,'*');
	return 0;
}