Cod sursa(job #743741)

Utilizator cosmin79Carabet Cosmin Andrei cosmin79 Data 5 mai 2012 18:23:40
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include <stdio.h>
#include <string.h>
#define LMAX 31
char line[LMAX];
struct trie
{
	int pass,end;
	trie *fiu[LMAX];
	trie()
	{
		memset(fiu,0,sizeof(fiu));
		pass=end=0;
	}
};
trie *T=new trie;
void insert(trie *nod,char *s)
{
	nod->pass++;
	if (*s=='\n')
	{
		nod->end++;
		return ;
	}
	if (nod->fiu[*s-'a']==0)
		nod->fiu[*s-'a']=new trie;
	insert(nod->fiu[*s-'a'],s+1);
}
int erase(trie *nod,char *s)
{
	nod->pass--;
	if (*s=='\n')
		nod->end--;
	else
		if (erase(nod->fiu[*s-'a'],s+1))
			nod->fiu[*s-'a']=0;
	if (nod!=T && nod->pass==0)
	{
		delete nod;
		return 1;
	}
	return 0;
}
int count(trie *nod,char *s)
{
	if (*s=='\n')
		return nod->end;
	if (nod->fiu[*s-'a']==0)
		return 0;
	return count(nod->fiu[*s-'a'],s+1);
}
int lcp(trie *nod,char *s,int how_much)
{
	if (*s=='\n' || nod->fiu[*s-'a']==0)
		return how_much;
	return lcp(nod->fiu[*s-'a'],s+1,how_much+1);
}
int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	fgets(line+1,LMAX,stdin);
	while (!feof(stdin))
	{
		switch (line[1])
		{
			case '0': insert(T,line+3); break ;
			case '1': erase(T,line+3); break ;
			case '2': printf("%d\n",count(T,line+3)); break ;
			case '3': printf("%d\n",lcp(T,line+3,0)); break;
		}
		fgets(line+1,LMAX,stdin);
	}
	return 0;
}