Cod sursa(job #516474)

Utilizator blastoiseZ.Z.Daniel blastoise Data 24 decembrie 2010 12:19:10
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <stdio.h>
#include <string.h>

#define CH (*w-'a')

char w[25];
int sw;

struct tree
{
	int nod,cnt;
	tree* link[26];

	tree()
	{
		cnt=nod=0;
		memset(link,NULL,sizeof(link));
	}
}*Trie;

void add(tree *trie,char *w)
{
	if(*w=='\0')
	{
		trie->nod++;
		return;
	}
	else
	{
		if(trie->link[CH]==NULL)
		{
			trie->link[CH]=new tree;
			trie->cnt++;
		}
		add(trie->link[CH],w+1);
	}
}

int del(tree *trie,char *w)
{
	if(*w=='\0') trie->nod--;
	else
	if(del(trie->link[CH],w+1))
	{
		trie->link[CH]=NULL;
		trie->cnt--;
	}
	if(trie->nod==0&&trie->cnt==0&&trie!=Trie)
	{
		delete trie;
		return 1;
	}
	return 0;
}

int frq(tree *trie,char *w)
{
	if(*w=='\0')
	{
		return trie->nod;
	}
	else
	if(trie->link[CH]!=NULL) return frq(trie->link[CH],w+1);
	else return 0;
}

int pre(tree *trie,char *w,int level)
{
	if(*w=='\0'||trie->link[CH]==NULL) return level;
	else return pre(trie->link[CH],w+1,level+1);
}

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);

	Trie=new tree;

	fgets(w,25,stdin);
	sw=w[0]-'0';
	strcpy(w,w+2);
	w[strlen(w)-1]='\0';
	
	while(!feof(stdin))
	{
		if(sw==0) add(Trie,w);
		else
		if(sw==1) del(Trie,w);
		else
		if(sw==2) printf("%d\n",frq(Trie,w));
		else
		if(sw==3) printf("%d\n",pre(Trie,w,0));

		fgets(w,25,stdin);
		sw=w[0]-'0';
		strcpy(w,w+2);
		w[strlen(w)-1]='\0';
	}

	return 0;
}