Cod sursa(job #743653)

Utilizator mihaidutescuDutescu Mihai mihaidutescu Data 5 mai 2012 13:47:38
Problema Trie Scor 35
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <cstdio>
#include <cstring>

struct trie
{
	int numcuv;
	int numpre;
	trie *a[26];
};

char primchar;

trie *trie_nou()
{
	trie *tmp=new trie;
	tmp->numcuv=tmp->numpre=0;
	memset(tmp->a,NULL,sizeof(trie *)*26);
	return tmp;
}

void adauga_cuv(trie *poz,char *cuv)
{
	primchar=cuv[0];
	if(primchar)
	{
		if(!poz->a[primchar-'a'])
			poz->a[primchar-'a']=trie_nou();
		cuv++;
		poz->numpre++;
		adauga_cuv(poz->a[primchar-'a'],cuv);
	}
	else
	{
		poz->numcuv++;
		poz->numpre++;
	}
}

int num_apar(trie *poz,char *cuv)
{
	primchar=cuv[0];
	if(primchar)
	{
		if(poz->a[primchar-'a'])
		{
			cuv++;
			return num_apar(poz->a[primchar-'a'],cuv);
		}
		else
			return 0;
	}
	else
		return poz->numcuv;
}

int sterge_cuv(trie* poz,char *cuv)
{
	char primchar=cuv[0];
	if(primchar)
	{
		cuv++;
		if(sterge_cuv(poz->a[primchar-'a'],cuv))
		{
			delete poz->a[primchar-'a'];
			poz->a[primchar-'a']=NULL;
		}
		poz->numpre--;
		return !poz->numcuv&&!poz->numpre;
	}
	else
	{
		poz->numcuv--;
		poz->numpre--;
		return !poz->numcuv&&!poz->numpre;
	}
}

char lung_pref(trie *poz,char *cuv,char lung)
{
	primchar=cuv[0];
	if(primchar)
	{
		if(poz->a[primchar-'a'])
		{
			cuv++;
			return lung_pref(poz->a[primchar-'a'],cuv,lung+1);
		}
		else
			return lung;
	}
	else
		return lung;
}

int main()
{
	FILE *f=fopen("trie.in","r"),*g=fopen("trie.out","w");
	char *a=new char[23];
	int cod_op;
	trie *trie=trie_nou();
	while(!feof(f))
	{
		fgets(a,23,f);
		cod_op=a[0]-'0';
		a[strlen(a)-1]=NULL;
		a+=2;
		if(cod_op==0)
			adauga_cuv(trie,a);
		else if(cod_op==1)
			sterge_cuv(trie,a);
		else if(cod_op==2)
			fprintf(g,"%d\n",num_apar(trie,a));
		else if(cod_op==3)
			fprintf(g,"%d\n",lung_pref(trie,a,0));
		
		a-=2;
	}
	return 0;
}