Cod sursa(job #392147)

Utilizator blasterzMircea Dima blasterz Data 6 februarie 2010 20:28:34
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.51 kb
#include <cstdio>
#include <string>
#include <cstdlib>

struct nod
{
	nod *next[26];
	int nrAparitii;
	int nrSons;
	nod()
	{
		memset(next, 0, sizeof(next));
		nrAparitii = 0;
		nrSons = 0;
	}

};

nod *root;

void init()
{
	root = new nod;
}


inline void insert(nod *R, char a[], int n)
{
	int i;
	nod *T = R;

	for(i = 0; i < n; ++i)
	{
		if(T->next[a[i] - 'a'] == NULL)
		{
			T->next[a[i] - 'a'] = new nod;
			++T->nrSons;
		}
		T = T->next[a[i] - 'a'];
	}
	++T->nrAparitii;
}

inline int erase(nod *R, char a[], int n)
{
	if(R == NULL) return 0;

	if(a[n] == 0)
		-- R->nrAparitii;
	else
	if(erase(R->next[a[n] - 'a'], a, n + 1))
		R->next[a[n] - 'a'] = NULL,
		--R->nrSons;

	if(R->nrSons == 0 && R->nrAparitii == 0 && R != root)
	{
		delete R;
		return 1;
	}
	return 0;
}	


inline int nrAparitii(nod *R, char a[], int n)
{
	int i;
	nod *T = R;

	for(i = 0; i < n; ++i)
	{
		if(T->next[a[i] - 'a'] == NULL) return 0;
		T = T->next[a[i] - 'a'];
	}

	return T->nrAparitii;

}

inline int lcp(nod *R, char a[], int n)
{
	int i;
	nod *T = R;

	for(i = 0; i < n; ++i)
	{
		if(T->next[a[i] - 'a'] == NULL) return i;
		T = T->next[a[i] - 'a'];
	}

	return n;

}

int main()
{

	init();
	
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	char a[32];
	int t;

	while(scanf("%d %s\n", &t, &a) > 0)
	{
		a[strlen(a)] = 0;
		if(t == 0) insert(root, a, strlen(a));
		if(t == 1) erase(root, a, 0);
		if(t == 2) printf("%d\n", nrAparitii(root, a, strlen(a)));
		if(t == 3) printf("%d\n", lcp(root, a, strlen(a)));
	}
	

	return 0;
}