Cod sursa(job #233710)

Utilizator AndreyPAndrei Poenaru AndreyP Data 18 decembrie 2008 23:10:30
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include<stdio.h>
#include<string.h>
struct trie
{
	int cnt,nrfii;
	trie *fiu[26];
	trie()
	{
		cnt=nrfii=0;
		memset(fiu,0,sizeof(fiu));
	}
};
trie *t=new trie;
void add(trie *nod,char *s)
{
	if(*s=='\n')
	{
		nod->cnt++;
		return;
	}
	int c=*s-'a';
	if(nod->fiu[c]==0)
	{
		nod->fiu[c]=new trie;
		nod->nrfii++;
	}
	add(nod->fiu[c],s+1);
}
bool del(trie *nod,char *s)
{
	if(*s=='\n')
		nod->cnt--;
	else
	if(del(nod->fiu[*s-'a'],s+1))
	{
		nod->fiu[*s-'a']=0;
		nod->nrfii--;
	}
	if(nod->cnt==0 && nod->nrfii==0 && nod!=t)
	{
		delete nod;
		return true;
	}
	return false;
}
int numara(trie *nod,char *s)
{
	if(*s=='\n')
		return nod->cnt;
	if(nod->fiu[*s-'a'])
		return numara(nod->fiu[*s-'a'],s+1);
	return 0;
}
int numara(trie *nod,char *s,int k)
{
	if(*s=='\n')
		return k;
	if(nod->fiu[*s-'a']==0)
		return k;
	return numara(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	char c[25];
	fgets(c,25,stdin);
	while(!feof(stdin))
	{
		if(c[0]=='0')
			add(t,c+2);
		else
		if(c[0]=='1')
			del(t,c+2);
		else
		if(c[0]=='2')
			printf("%d\n",numara(t,c+2));
		else
		if(c[0]=='3')
			printf("%d\n",numara(t,c+2,0));
		fgets(c,25,stdin);
	}
	return 0;
}