Cod sursa(job #602379)

Utilizator proflaurianPanaete Adrian proflaurian Data 11 iulie 2011 11:16:35
Problema Trie Scor 90
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include<cstdio>
struct Trie{ int C;Trie *F[26];};
Trie *root,*paux,*pnew,*nou();
int lung,i,c,r,fake(Trie*);
char *w,W[25];
void readd(),solve(),ADD(),DEL(),NUM(),PRE();
int main()
{
	freopen("trie.in","rt",stdin);
	freopen("trie.out","wt",stdout);
	root=nou();
	for(;scanf("%d",&c)==1;)
	{
		scanf("%s",W);
		if(c==0){ADD();continue;}
		if(c==1){DEL();continue;}
		if(c==2){NUM();continue;}
		PRE();
	}
	return 0;
}
void ADD()
{ 
	Trie *p;
	for(p=root,w=W;*w;w++){if(!p->F[*w-'a'])p->F[*w-'a']=nou();p=p->F[*w-'a'];}p->C++;
}
void DEL()
{
	int u,q[25];Trie *p,*pa,*Q[25];
	for(w=W,p=root,u=0;*w;w++){q[++u]=*w-'a';p=p->F[*w-'a'];Q[u]=p;}p->C--;
	for(;u;u--){if(!fake(Q[u]))return;p=Q[u];pa=Q[u-1];pa->F[q[u]]=0;delete p;}
}
void NUM()
{
	Trie *p;
	for(p=root,w=W;*w;w++){if(!p->F[*w-'a']){printf("0\n");return;}p=p->F[*w-'a'];}
	printf("%d\n",p->C);
}
void PRE()
{
	int pr=0;Trie *p;
	for(p=root,w=W;*w;w++){if(!p->F[*w-'a']){printf("%d\n",pr);return;}p=p->F[*w-'a'];pr++;}
	printf("%d\n",pr);
}
Trie *nou()
{
	Trie *p=new Trie;p->C=0;for(int j=0;j<26;j++)p->F[j]=0;return p;
}
int fake(Trie *p)
{
	if(p->C)return 0;for(int j=0;j<26;j++)if(p->F[j])return 0;return 1;
}