Cod sursa(job #377304)

Utilizator marinaMarina Horlescu marina Data 23 decembrie 2009 23:01:50
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.57 kb
#include <stdio.h>

const char INPUT[] = "trie.in";
const char OUTPUT[] = "trie.out";
const int LEN_CUV = 21;
const int NR_FII = 26;

struct nod
{
	nod *next[NR_FII];
	int info;
}*root;

void init(nod *&p)
{
	p = new nod;
	p -> info = 0;
	int i;
	for(i = 0; i < NR_FII; ++i)
		p -> next[i] = NULL;
}

void insert(nod *r, char *cuv)
{
	if(*cuv == NULL)
	{
		++(r -> info);
		return;
	}
	if(r -> next[ *cuv - 'a'] != NULL) 
	{
		insert(r -> next[ *cuv - 'a'], cuv + 1);
		return;
	}
	init(r -> next[ *cuv - 'a']);
	insert(r -> next[ *cuv - 'a'], cuv + 1);
}

void deleteNod(nod *&r, char *cuv)
{
	if(*cuv == NULL)
	{
		--(r -> info);
		if(r -> info == 0)
		{
			delete r;
			r = NULL;
		}
		return;
	}
	if(r -> next[*cuv - 'a'] == NULL) ; //printf("ERROR!! %s\n", cuv);
	else deleteNod(r -> next[*cuv - 'a'], cuv+1);
}

int countApar(nod *r, char *cuv)
{
	if(*cuv == NULL) return r -> info;
	if(r -> next[ *cuv - 'a' ] == NULL) return 0;
	return countApar(r -> next[ *cuv - 'a' ], cuv+1);
}

int prefix(nod *r, char *cuv)
{
	if(*cuv == NULL || r -> next[*cuv - 'a'] == NULL)
		return 0;
	return 1 + prefix(r -> next[*cuv - 'a'], cuv + 1);
}

int main()
{
	freopen(INPUT, "r", stdin);
	freopen(OUTPUT, "w", stdout);
	
	init(root);
	
	while(!feof(stdin))
	{
		int nr;
		char* cuv = new char[LEN_CUV];
		scanf("%d %s", &nr, cuv);
		
		if(nr == 0) insert(root, cuv);
		else if(nr == 1) deleteNod(root, cuv);
		else if(nr == 2) printf("%d\n", countApar(root, cuv));
		else printf("%d\n", prefix(root, cuv));
	}
	return 0;
}