Cod sursa(job #290636)

Utilizator FlorianFlorian Marcu Florian Data 28 martie 2009 14:36:21
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include<cstdio>
#include<cstring>
using namespace std;
#define C (*s - 'a')
struct Trie
{
	int cnt, nrfii;
	Trie *fiu[26];
	Trie()
	{
		cnt = nrfii = 0;
		memset(fiu,0,sizeof(fiu));
	}
};
Trie *T=new Trie;
void adauga(Trie *nod, char *s)
{
	if(*s=='\n')
	{
		nod->cnt ++;
		return;
	}
	if(!nod->fiu[ C ])
	{
		nod->nrfii ++;
		nod->fiu [ C ] = new Trie;
	}
	adauga(nod->fiu[ C ], s+1);
}
int sterge(Trie *nod, char *s)
{
	if(*s == '\n')
	{
		nod->cnt --;
	}
	else if(sterge(nod->fiu[C],s+1))
	{
		nod->nrfii-- ; nod->fiu[C] = 0; 
	}
	if(nod->cnt == 0 && nod->nrfii == 0 && nod != T) 
		{
			delete(nod);
			return 1;
		}
	
	return 0;
}
int query(Trie *nod, char *s)
{
	if(*s=='\n') return nod->cnt;
	if(nod->fiu[C]) return query(nod->fiu[C],s+1);
	return 0;
}
int prefix(Trie *nod, char *s, int k)
{
	if(*s=='\n' || nod->fiu[C]==0 ) return k;
	return prefix(nod->fiu[C], s+1, k+1);
}
int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);

	char s[32];
	fgets(s,32,stdin);

	while(!feof(stdin))
	{
		if(s[0] == '0') adauga(T,s+2);
		else if(s[0]=='1') sterge(T,s+2);
		else if(s[0]=='2') printf("%d\n",query(T,s+2));
		else printf("%d\n",prefix(T,s+2,0));
		fgets(s,32,stdin);
	}
	return 0;
}