Cod sursa(job #433265)

Utilizator NemultumituMatei Ionita Nemultumitu Data 3 aprilie 2010 15:14:52
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <cstdio>
struct nod
{
	int val;
	nod* litera[28];
};
nod rad;
char cuv[22];

void adauga()
{
	nod *p=&rad,*pold=&rad;
	rad.val++;
	for (int i=0;cuv[i]!='\n';++i)
	{
		if ((*p).litera[cuv[i]-'a']!=NULL)
		{
			p=(*p).litera[cuv[i]-'a'];
			pold=p;
			(*p).val++;
			continue;
		}
		p=new nod;
		(*p).val=0;
		for (int j=0;j<28;++j)
			(*p).litera[j]=NULL;
		(*pold).litera[cuv[i]-'a']=p;
		(*p).val++;
		pold=p;
	}
}

void sterge()
{
	nod *pold=&rad;
	nod *p=rad.litera[cuv[0]-'a'];
	nod *pnew=p;
	(*p).val--;
	(*pold).val--;
	int i;
	for (i=1;cuv[i]!='\n';++i)
	{
		pnew=(*p).litera[cuv[i]-'a'];
		(*pnew).val--;
		if ((*p).val==0)
		{
			delete p;
			(*pold).litera[cuv[i-1]-'a']=NULL;
		}
		pold=p;
		p=pnew;
	}
	if ((*p).val==0)
	{
		delete p;
		(*pold).litera[cuv[i-1]-'a']=NULL;
	}
}

int aparitii()
{
	nod *p=&rad;
	for (int i=0;cuv[i]!='\n';++i)
	{
		if ((*p).litera[cuv[i]-'a']==NULL)
			return 0;
		p=(*p).litera[cuv[i]-'a'];
	}
	int nr=(*p).val;
	for (int i=0;i<28;++i)
	{
		nod *r=(*p).litera[i];
		if (r!=NULL)
			nr-=(*r).val;
	}
	return nr;
}

int prefix()
{
	nod *p=&rad;
	int i;
	for (i=0;cuv[i]!='\n';++i)
	{
		if ((*p).litera[cuv[i]-'a']==NULL)
			return i;
		p=(*p).litera[cuv[i]-'a'];
	}
	return i;
}

int main()
{
	freopen ("trie.in","r",stdin);
	freopen ("trie.out","w",stdout);
	int cod,cnt=0;
	while (scanf("%d ",&cod)!=EOF&&cnt<100000)
	{
		fgets(cuv,21,stdin);
		if (cod==0)
			adauga();
		if (cod==1)
			sterge();
		if (cod==2)
			printf("%d\n",aparitii());
		if (cod==3)
			printf("%d\n",prefix());
		++cnt;
	}
	return 0;
}