Cod sursa(job #1428081)

Utilizator stef93Stefan Gilca stef93 Data 3 mai 2015 17:46:05
Problema Trie Scor 100
Compilator c Status done
Runda Arhiva educationala Marime 1.78 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

struct trie
{
	int nr_fii, cnt;
	struct trie* fii[26];
};

typedef struct trie trie;

trie * radacina;

trie * make_trie()
{
	trie * x = (trie*) malloc(sizeof(trie));

	x->nr_fii = 0;
	x->cnt = 0;

	memset(x->fii, 0, sizeof(x->fii));
	if(x == NULL)
	{
		perror("Eroare:");
		exit(EXIT_FAILURE);
	}
	return x;
}

void insert(trie * t, const char * s)
{
	if(*s == '\n')
	{
		t->cnt++;
	}
	else
	{
		if(t->fii[*s - 'a'] == 0)
		{
			t->fii[*s - 'a'] = make_trie();
			t->nr_fii++;
		}
		insert(t->fii[*s - 'a'], s + 1);
	}
}

int del(trie * t, const char * s)
{
	if(*s == '\n')
	{
		t->cnt--;
	}
	else
	{
		if(del(t->fii[*s - 'a'], s + 1) == 1)
		{
			t->fii[*s - 'a'] = 0;
			t->nr_fii --;
		}
	}

	if(t->nr_fii == 0 && t->cnt == 0 && t != radacina)
	{
		free(t);
		t = NULL;
		return 1;
	}

	return 0;
}

int numara(trie * t, const char * s)
{
	if(*s == '\n')
	{
		return t->cnt;
	}
	else
	{
		if(t->fii[*s - 'a'] == NULL)
		{
			return 0;
		}
		else
		{
			return numara(t->fii[*s - 'a'], s + 1);
		}
	}
}

int prefix(trie * t, const char * s, int k)
{
	if(*s == '\n' || t->fii[*s - 'a'] == NULL)
	{
		return k;
	}
	else
	{
		return prefix(t->fii[*s - 'a'], s + 1, k + 1);
	}
}
int main()
{
	char s[35];

	FILE * in = fopen("trie.in", "r");
	FILE * out = fopen("trie.out", "w");

	radacina = make_trie();
	fgets(s, 35, in);

	while(!feof(in))
	{
		//printf(s);
		switch(s[0])
		{
		case '0': insert(radacina, s + 2); break;
		case '1': del(radacina, s + 2); break;
		case '2': fprintf(out, "%d\n", numara(radacina, s + 2));break;
		case '3':fprintf(out, "%d\n", prefix(radacina, s + 2, 0));
		}

		fgets(s, 35, in);
	}

	return 0;
}