Cod sursa(job #339428)

Utilizator razvi9Jurca Razvan razvi9 Data 9 august 2009 18:51:41
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.3 kb
#include<cstdio>
#include<cstring>

int op;
char str[30];

struct node
{
	node *a[26];
	int c;
};

node top;
char c,d;
node *x;

void add(char *a)
{
	x = &top;
	while(*a!=0)
	{
		c = *a - 'a';
		if(x->a[c] == NULL)
		{
			x->a[c] = new node;
			memset(x->a[c],0,sizeof(node));
		}
		x = x->a[c];
		++a;
	}
	++(x->c);
}


void del(char* a,node *y)
{
	if(*a==0)
	{
		y->c --;
		return;
	}
	del(a+1,y->a[*a-'a']);
	c = *a - 'a';
	x = y->a[c];
	if(x->c == 0)
	{
		for(d=0;d<26;++d)
			if(x->a[d]!=NULL) break;
		if(d==26)
		{
			delete x;
			y->a[c] = NULL;
		}
	}	
}

int count(char* a)
{
	x = &top;
	while(*a!=0)
	{
		c = *a - 'a';
		if(x->a[c]==NULL)
			return 0;
		x = x->a[c];
		++a;
	}
	return x->c;
}

int nr;

int comm(char* a)
{
	nr = 0;
	x = &top;
	while(*a!=0)
	{
		c = *a - 'a';
		if(x->a[c]==NULL)
			break;
		++nr;
		x = x->a[c];
		++a;
	}
	return nr;
}

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	while(!feof(stdin))
	{
		scanf("%d %s ",&op,str);
		switch(op)
		{
		case 0:
			add(str);
			break;
		case 1:
			del(str,&top);
			break;
		case 2:
			printf("%d\n",count(str));
			break;
		case 3:
			printf("%d\n",comm(str));
			break;
		}
	}
	fclose(stdout);
	return 0;
}