Cod sursa(job #778062)

Utilizator tm_raduToma Radu tm_radu Data 13 august 2012 20:49:35
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.45 kb
#include <stdio.h>
#include <string.h>

typedef struct node {
	int nrPrefix;
	int nrWord;
	node* next[26];
} NODE, *PNODE;

int op, wordSize;
char word[20];
PNODE root;

PNODE Insert(PNODE nod, int index);
PNODE Delete(PNODE nod, int index);
int Count(PNODE nod, int index);
int Prefix(PNODE nod, int index);
void FreeMemory(PNODE node);

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

	root = new NODE;
	for (int i = 0; i < 26; root->next[i] = NULL, i++);

	scanf("%d %s", &op, word);
	while (op != -1)
	{
		wordSize = strlen(word);
		switch(op)
		{
			case 0: root->next[word[0]-'a'] = Insert(root->next[word[0]-'a'], 0); break;
			case 1: root->next[word[0]-'a'] = Delete(root->next[word[0]-'a'], 0); break;
			case 2: printf("%d\n", Count(root->next[word[0]-'a'], 0)); break;
			default: printf("%d\n", Prefix(root->next[word[0]-'a'], 0)); break;
		}
		op = -1;
		scanf("%d %s", &op, word);
	}

	FreeMemory(root);
	return 0;
}

PNODE Insert(PNODE node, int index)
{
	if (index == wordSize) return NULL;

	if (node == NULL)
	{
		PNODE p = new NODE;
		for (int i = 0; i < 26; p->next[i] = NULL, i++);
		p->nrPrefix = 1;
		if (index < wordSize-1) 
		{
			p->next[word[index+1]-'a'] = Insert(p->next[word[index+1]-'a'], index+1);
			p->nrWord = 0;
		}
		else
			p->nrWord = 1;
		return p;
	}
	else
	{
		node->nrPrefix++;
		if (index < wordSize-1)
			node->next[word[index+1]-'a'] = Insert(node->next[word[index+1]-'a'], index+1);
		else
			node->nrWord++;
		return node;
	}
}

PNODE Delete(PNODE node, int index)
{
	if (index == wordSize) return NULL;

	if (index < wordSize-1)
		node->next[word[index+1]-'a'] = Delete(node->next[word[index+1]-'a'], index+1);
	else
		node->nrWord--;

	node->nrPrefix--;
	if (node->nrPrefix == 0)
	{
		delete node;
		return NULL;
	}
	return node;
}

int Count(PNODE node, int index)
{
	if (index == wordSize || node == NULL) return 0;

	if (index == wordSize - 1)
		return node->nrWord;
	else
		return Count(node->next[word[index+1]-'a'], index+1);
}

int Prefix(PNODE node, int index)
{
	if (index == wordSize || node == NULL) return 0;
	if (node->nrPrefix < 1) return 0;

	if (index == wordSize - 1)
		return 1;
	else
		return 1 + Prefix(node->next[word[index+1]-'a'], index+1);
}

void FreeMemory(PNODE node)
{
	for (int i = 0; i < 26; i++)
		if (node->next[i] != NULL)
			FreeMemory(node->next[i]);

	delete node;
}