Cod sursa(job #955196)

Utilizator radustn92Radu Stancu radustn92 Data 31 mai 2013 03:10:48
Problema Trie Scor 5
Compilator c Status done
Runda Arhiva educationala Marime 1.77 kb
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define LMAX 26
char word[LMAX];

typedef struct trie_node 
{
	struct trie_node *children[LMAX];
	int pass, end;
} trie;

trie *create_new_node()
{
	trie *new_node = malloc(sizeof(trie));
	new_node -> pass = new_node -> end = 0;
	int i;
	for (i = 0; i < LMAX; i++)
		new_node -> children[i] = NULL;
		
	return new_node;
}

trie *root;

void insert(trie *node, char *s)
{
	node -> pass++;
	if (*s == '\0')
	{
		node -> end++;
		return ;
	}
		
	if (node -> children[*s - 'a'] == NULL)
		node -> children[*s - 'a'] = create_new_node();	
	insert(node -> children[*s - 'a'], s + 1);
}

int count(trie *node, char *s)
{
	if (*s == '\0')
		return node -> end;
	
	if (node -> children[*s - 'a'] == NULL)
		return 0;
	return count(node -> children[*s - 'a'], s + 1);
}

void delete_node(trie *node)
{
	free(node);
}

int delete(trie *node, char *s)
{
	node -> pass--;
	if (*s == '\0')
	{
		if (node -> pass == 0)
		{
			delete_node(node);
			return 1;
		}
		return 0;
	}
	
	if (delete(node -> children[*s - 'a'], s + 1))
		node -> children[*s - 'a'] = NULL;
	
	if (node -> pass == 0)
	{
		delete_node(node);
		return 1;
	}
	return 0;	
}

int lcp_any(trie *node, char *s)
{
	if (*s == '\0')
		return 0;
	if (node -> children[*s - 'a'] != NULL)
		return 1 + lcp_any(node -> children[*s - 'a'], s + 1);
		
	return 0;
}

int main()
{
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	root = create_new_node();
	
	int type;
	while (!feof(stdin))
	{
		scanf("%d%s\n", &type, word);
		switch (type)
		{
			case 0:	
					insert(root, word);
					break ;
			case 1:
					delete(root, word);
					break ;
			case 2:
					printf("%d\n", count(root, word));
					break ;
			case 3:
					printf("%d\n", lcp_any(root, word));
					break ;
		}
	}
	return 0;
}