Cod sursa(job #310119)

Utilizator crawlerPuni Andrei Paul crawler Data 1 mai 2009 20:09:34
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.33 kb
#include <stdio.h>
#include <string.h>


#define Nmax 100100

char sir[Nmax];

struct Trie
{
	int cnt,nrfii;
	Trie *a[26];
	Trie()
	{
		cnt = nrfii = 0;
		memset(a,0,sizeof(a));
	}
};

Trie *T;

void add(Trie *nod, char *p)
{
	if (*p == '\n')
	{	
		++nod->cnt;
		return;
	}
	if (nod->a[*p-'a'] == 0)
	{
		nod->a[*p-'a'] = new Trie;
		++nod->nrfii;
	}	
	add(nod->a[*p-'a'],p+1);
}

int del(Trie *nod, char *p) 
{
	if( *p == '\n' )
		--nod->cnt;	
	else if(del(nod->a[*p - 'a'], p+1)) 
	{
		nod->a[*p-'a'] = 0;
		--nod->nrfii;
	}
	if(nod->cnt == 0 && nod->nrfii == 0 && nod != T) 
	{
		delete nod; 
		return 1;
	}
	return 0;
}

int exista(Trie *nod, char *p)
{
	if (*p == '\n')
		return nod->cnt;
	if (nod->a[*p-'a'] != 0)
		return exista(nod->a[*p-'a'],p+1);
	return 0;
}

int prefix(Trie *nod, char *p)
{
	if ((*p == '\n') || (nod->a[*p-'a'] == 0))
		return nod->cnt;
	return exista(nod->a[*p-'a'],p+1);	
}

int main()
{
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w",stdout);
	
	T = new Trie;
	
	while (!feof(stdin))
	{
		fgets(sir,Nmax,stdin);	
		
		if (sir[0] == '0')
			add(T,sir+2);		
		if (sir[0] == '1')
			del(T,sir+2);
		if (sir[0] == '2')
			printf("%d\n", exista(T,sir+2));
		if (sir[0] == '3')
			printf("%d\n", prefix(T,sir+2));
	}


	return 0;
}