Cod sursa(job #350440)

Utilizator crisojogcristian ojog crisojog Data 23 septembrie 2009 21:56:17
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<stdio.h>
#include<string.h>

char s[26],l;
int x;

struct nod
{
	nod *u[28];
	long nc,pf; 
};
nod *t;
void init(nod *t)
{
	int i;
	for(i=0;i<26;++i) t->u[i]=0;
	t->nc=t->pf=0;
}
void add()
{
	int i;
	nod *p, *aux;
	p=t;
	for(i=0;i<l-1;++i)
	{
		if(p->u[s[i]-'a'])
		{
			p=p->u[s[i]-'a'];
			p->pf++;
		}
		else
		{
			aux=new nod;
			init(aux);
			p->u[s[i]-'a']=aux;
			p=aux;
			p->pf++;
		}
	}
	
	if(p->u[s[i]-'a'])
	{
		p=p->u[s[i]-'a'];
		p->pf++;
		p->nc++;
	}
	else
	{
		aux=new nod;
		init(aux);
		p->u[s[i]-'a']=aux;
		p=aux;
		p->pf++;
		p->nc++;
	}
}
void del()
{
	int i;
	nod *p;
	p=t;
	for(i=0;i<l;++i)
	{
		p=p->u[s[i]-'a'];
		p->pf--;
	}
	p->nc--;
}
void nrap()
{
	int i;
	nod *p;
	p=t;
	for(i=0;i<l;++i)
	{
		if(p->u[s[i]-'a'])
			p=p->u[s[i]-'a'];
		else
		{
			printf("0\n");return;
		}
	}
	printf("%ld\n",p->nc);
}
void prefix()
{
	int i;
	nod *p;
	p=t;
	long L=0;
	for(i=0;i<l;++i)
	{
		if(p->u[s[i]-'a'])
		{
			p=p->u[s[i]-'a'];
			if(p->pf)
				L++;
			else {printf("%ld\n",L);return;}
		}
		else
		{
			printf("%ld\n",L);return;
		}
	}
}
int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	t=new nod;
	init(t);
	while(scanf("%d",&x)!=EOF)
	{
		scanf("%s",&s);
		l=strlen(s);
		if(x==0)
			add();
		else if(x==1)
				del();
		else if(x==2)
				nrap();
		else if(x==3)
				prefix();
	}
	return 0;
}