Cod sursa(job #581514)

Utilizator darkseekerBoaca Cosmin darkseeker Data 14 aprilie 2011 12:03:01
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <cstdio>
using namespace std;

#define Input "trie.in"
#define Output "trie.out"	

struct Trie{
	Trie *fii[26];
	int cnt,nrfii;
} *R = NULL;

inline void creaza(Trie *&nod)
{
	int i;
	nod = new Trie;
	nod->cnt = 0;
	nod->nrfii = 0;
	for(i=0; i<26; i++)
		nod->fii[i] = NULL;
}

inline void insert(Trie *T,char *sir)
{
	if(*sir!='\n')
		if(T->fii[*sir-'a'])
			insert(T->fii[*sir-'a'],sir+1);
		else
			creaza(T->fii[*sir-'a']),T->nrfii++, insert(T->fii[*sir-'a'],sir+1);
	else
		T->cnt++;
}

inline int sterge(Trie *T,char *sir)
{
	if(*sir == '\n')
		T->cnt--;
	else
		if(sterge(T->fii[*sir-'a'],sir+1))
			T->fii[*sir-'a']=NULL, T->nrfii--;
	if(T->cnt == 0 && T->nrfii == 0 && T!=R)
	{ delete T; return 1; }
	return 0;
}

inline int count(Trie *T,char *sir)
{
	if(*sir != '\n')
		if(T->fii[*sir-'a'])
		return 0+count(T->fii[*sir-'a'],sir+1);
		else
		return 0;
	else
		return T->cnt;
}

inline int LCP(Trie *T,char *sir){
	if(*sir!='\n' && T->fii[*sir-'a'])
		return 1+LCP(T->fii[*sir-'a'],sir+1);
	return 0;
}

int main()
{
	char line[200];
	freopen (Input,"r",stdin);
	freopen (Output,"w",stdout);
	
	creaza(R);
	
	while(!feof(stdin))
	{
		fgets(line,100,stdin);
		switch(line[0])
		{
			case '0':insert(R,line+2);break;
			case '1':sterge(R,line+2);break;
			case '2':printf("%d\n",count(R,line+2));break;
			case '3':printf("%d\n",LCP(R,line+2));break;
		}
		line[0] = '5';
	}
	return 0;
}