Cod sursa(job #593385)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 2 iunie 2011 15:49:59
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include <stdio.h>
#include <string.h>
#define HMAX 31
char line[HMAX];
struct trie
{
	int cnt,nr;
	trie *fiu[HMAX];
	trie()
	{
		cnt=nr=0;
		memset(fiu,0,sizeof(fiu));
	}
};
trie *T=new trie;
void ins(trie *nod,char *s)
{
	nod->cnt++;
	if (*s=='\n')
	{
		nod->nr++;
		return ;
	}
	if (nod->fiu[*s-'a']==0)
		nod->fiu[*s-'a']=new trie;
	ins(nod->fiu[*s-'a'],s+1);
}
int del(trie *nod,char *s)
{
	nod->cnt--;
	if (*s=='\n')
		nod->nr--;
	else
		if (del(nod->fiu[*s-'a'],s+1))
			nod->fiu[*s-'a']=0;
	if (nod->cnt==0 && nod->nr==0 && nod!=T)
	{
		delete nod;
		return 1;
	}
	return 0;
}
int numara(trie *nod,char *s)
{
	if (*s=='\n')
		return nod->nr;
	if (nod->fiu[*s-'a']==0)
		return 0;
	return numara(nod->fiu[*s-'a'],s+1);
}
int common(trie *nod,char *s,int rez)
{
	if (nod->fiu[*s-'a']==0 || *s=='\n')
		return rez;
	return common(nod->fiu[*s-'a'],s+1,rez+1);
}
int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	fgets(line+1,HMAX,stdin);
	while (!feof(stdin))
	{
		switch (line[1])
		{
			case '0': ins(T,line+3); break ;
			case '1': del(T,line+3); break ;
			case '2': printf("%d\n",numara(T,line+3)); break ;
			case '3': printf("%d\n",common(T,line+3,0)); break ;
		}
		fgets(line+1,HMAX,stdin);
	}
	return 0;
}