Cod sursa(job #780613)

Utilizator VladberilaVladutz Vladberila Data 20 august 2012 21:21:09
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <cstdio>
#include <cstring>
#define nmax 30
FILE *f = fopen("trie.in","r");
FILE *g = fopen("trie.out","w");

class nod
{
private:
	int nrfii,aparitii;
	nod* fiu[nmax];
	
public:
	nod()
	{
		aparitii=nrfii=0;
		memset(fiu,0,sizeof(fiu));
	}
	void insert(char*);
	int del(char*);
	int print(char*);
	int prefix(char*,int);
	void solve();
};

nod *r = new nod;

void nod::insert(char* cuv)
{
	if(*cuv == '\n')
	{
		aparitii++;
		return;
	}
	if(fiu[*cuv-'a'] == 0)
	{
		fiu[*cuv-'a'] = new nod;
		nrfii++;
	}
	fiu[*cuv-'a']->insert(cuv+1);
}

int nod::del(char* cuv)
{
	if(*cuv=='\n')
	{
		aparitii--;
	}
	else if(fiu[*cuv-'a']->del(cuv+1) !=0)
	{
		fiu[*cuv-'a'] = NULL;
		nrfii--;
	}
	if(aparitii == 0 && nrfii == 0 && this!=r)
	{
		delete this;
		return 1;
	}
	return 0;
}

int nod::print(char *cuv)
{
	if(*cuv == '\n')
		return aparitii;
	return fiu[*cuv-'a']->print(cuv+1);
	return 0;
}

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

void nod::solve()
{
	while(!feof(f))
	{
		char cuv[50];
		fgets(cuv,50,f);
		if(cuv[0] == '0')
		{
			insert(cuv+2);
		}
		else if(cuv[0]=='1')
		{
			del(cuv+2);
		}
		else if(cuv[0]=='2')
		{
			fprintf(g,"%d\n",print(cuv+2));
		}
		else
		{
			fprintf(g,"%d\n",prefix(cuv+2,0));
		}
	}
}



int main()
{
	nod *r = new nod;
	r->solve();
	fclose(f);
	fclose(g);
	return 0;
}