Cod sursa(job #382638)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 14 ianuarie 2010 11:56:09
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <string.h>
#define LMAX 31
#define HMAX 26
struct trie
{
	int cnt,nrfii;
	trie *fiu[HMAX];
	trie () 
	{
		cnt=nrfii=0;
		memset(fiu,0,sizeof(fiu));
	}
};
trie *T= new trie;
void ins(trie *nod,char *s)
{
	if (*s=='\n')
	{
		nod -> cnt++;
		return ;
	}
	if (nod -> fiu[*s-'a'] ==0)
	{
		nod -> fiu[*s-'a'] = new trie;
		nod -> nrfii++;
	}
	ins (nod -> fiu[*s-'a'], s+1);
}
int 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 1;
	}
	return 0;
}
int nr(trie *nod,char *s)
{
	if (*s=='\n')
		return nod->cnt;
	if (nod ->fiu[*s-'a'])
		return nr(nod->fiu[*s-'a'],s+1);
	return 0;
}
int com(trie *nod,char *s,int rez)
{
	if (*s=='\n' || nod->fiu[*s-'a']==0)
		return rez;
	return com(nod->fiu[*s-'a'],s+1,rez+1);
}
int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	char line[LMAX];
	fgets(line,LMAX,stdin);
	while (!feof(stdin))
	{
		switch (line[0])
		{
			case '0':ins(T,line+2); break;
			case '1':del(T,line+2); break;
			case '2':printf("%d\n",nr(T,line+2)); break;
			case '3':printf("%d\n",com(T,line+2,0)); break;
		}
		fgets(line,LMAX,stdin);
	}
	return 0;
}