Cod sursa(job #750836)

Utilizator DaicuDaicu Alexandru Daicu Data 23 mai 2012 12:31:56
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.36 kb
#include <string.h>
#include <stdio.h>

int N;
char cuv[30];

typedef struct trie
{
	int x, nrfii;
	char c;
	trie *a[26];

	trie() 
	{  
		x = nrfii = 0;
		memset(a, 0, sizeof(a));
	}  
} *Trie;

Trie T = new trie;

void insert(Trie nod, int i)
{
	if (cuv[i] == NULL)
	{
		nod -> x++;
		return;
	}
	if (nod -> a[cuv[i] - 'a'] == 0)
	{
		nod -> a[cuv[i] - 'a'] = new trie;
		nod -> nrfii++;
	}
	insert(nod -> a[cuv[i] - 'a'], i + 1);
}

int del(Trie nod, int i)
{
	if (cuv[i] == NULL)
	{
		nod -> x--;
	}
	else if (del(nod -> a[cuv[i] - 'a'], i + 1))
	{
		nod -> nrfii--;
		nod -> a[cuv[i] - 'a'] = 0;
	}

	if (nod -> x == 0 && nod -> nrfii == 0 && nod != T)
	{
		delete nod; return 1;
	}
	return 0;
}

int nr_ap(Trie nod, int i)
{
	if (cuv[i] == NULL)
	{
		return nod -> x;
	}

	if (nod -> a[cuv[i] - 'a']) return nr_ap(nod -> a[cuv[i] - 'a'], i + 1);
	return 0;
}

int prefix(Trie nod, int i, int k)
{
	if (cuv[i] == NULL || nod -> a[cuv[i] - 'a'] == 0) return k;
	return prefix(nod -> a[cuv[i] - 'a'], i + 1, k + 1);
}

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

	int op;

	while (!feof(stdin))
	{
		scanf("%d %s", &op, cuv);
		if (feof(stdin)) break;
		switch(op)
		{
		case 0: { insert(T, 0); break;}
		case 1: { del(T, 0); break;}
		case 2: { printf("%d\n",nr_ap(T, 0)); break;}
		case 3: { printf("%d\n",prefix(T, 0, 0)); break;}
		}
	}
	return 0;
}