Cod sursa(job #735371)

Utilizator ms-ninjacristescu liviu ms-ninja Data 16 aprilie 2012 11:52:02
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <cstdio>
#include <cstring>
using namespace std;
#define dim 100005

char sir[dim];

struct trie
{
	int cnt, nr_fii;
	trie *fiu[26];
	trie()
	{
		cnt=nr_fii=0;
		memset(fiu,0,sizeof(fiu));
	}
};

trie *T=new trie;

void insert(trie *nod, char *p)
{
	if(*p=='\n')
	{
		nod->cnt++;
		return ;
	}
	if( nod->fiu[*p-'a']==0)
	{
		nod->fiu[*p-'a']=new trie;
		nod->nr_fii++;
	}
	insert(nod->fiu[*p-'a'],p+1);
}

int sterge(trie *nod, char *p)
{
	if(*p=='\n')
		nod->cnt--;
	else
		if(sterge(nod->fiu[*p-'a'],p+1))
		{
			nod->fiu[*p-'a']=0;
			nod->nr_fii--;
		}
	if(nod->cnt==0 && nod->nr_fii==0 && nod!=T)
	{
		delete nod;
		return 1;
	}
	return 0;
}
		
int aparitii(trie *nod, char *p)
{
		if(*p=='\n')
			return nod->cnt;
		if(nod->fiu[*p-'a']!=0)
			return aparitii(nod->fiu[*p-'a'],p+1);
		return 0;
}

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

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	
	do
	{
		fgets(sir,dim,stdin);
		if(sir[0]=='0')insert(T,sir+2);
		if(sir[0]=='1')sterge(T,sir+2);
		if(sir[0]=='2')printf("%d\n", aparitii(T,sir+2));
		if(sir[0]=='3')printf("%d\n", prefix(T,sir+2,0));

	}while(!feof(stdin));
	
	return 0;
}