Cod sursa(job #730235)

Utilizator Marius_mFMI-M2 Marius Melemciuc Marius_m Data 6 aprilie 2012 01:08:00
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include<cstdio>
#include<cstring>

using namespace std;

const int Nmax=26;                      // nr de litere ale alfabetului folosit
char s[21];                                // cuvantul citit din fisier

typedef struct trie {
	int fii,nrCuvinte;
	trie* fiu[Nmax];
	trie()
	{
		fii=nrCuvinte=0;
		memset(fiu,NULL,sizeof(fiu));
	}
}TRIE;

TRIE* w;


void insert_word(TRIE* word,int letter)
{
	if(s[letter]==NULL)
	{
		word->nrCuvinte++;
		return;
	}
	if(word->fiu[ s[letter]-'a' ]==NULL)
	{
		word->fiu[ s[letter]-'a' ]=new TRIE;
		word->fii++;
	}
	insert_word(word->fiu[ s[letter]-'a' ],letter+1);
}

bool delete_word(TRIE* word,int letter)
{
	if(s[letter]==NULL)
		word->nrCuvinte--;
	else
		if(delete_word(word->fiu[ s[letter]-'a' ],letter+1)==1)
		{
			word->fii--;
			word->fiu[ s[letter]-'a' ]=NULL;
		}
	if(word->fii==0 && word->nrCuvinte==0 && word!=w)             //daca nodul nu mai are fii si nu avea cuvinte care se termina in el si nu e nici radacina
	{
		delete word;
		return 1;
	}
	return 0;
}

int NumberOfWords(TRIE* word,int letter)
{
	if(s[letter]==NULL)
		return word->nrCuvinte;
	if(word->fiu[ s[letter]-'a' ] != NULL)             // de verificat daca merge fara if si fara return 0;
		return NumberOfWords(word->fiu[ s[letter]-'a' ],letter+1);
	return 0;
}

int NumberOfPrefixes(TRIE* word,int letter)
{
	if(s[letter]==NULL || word->fiu[ s[letter]-'a' ]==NULL)
		return letter;
	return NumberOfPrefixes(word->fiu[ s[letter]-'a' ],letter+1);
}

int main()
{
	int operation;
	w=new TRIE;               // w este radacina trie-ului
	FILE *in,*out;
	in=fopen("trie.in","r");
	out=fopen("trie.out","w");
	while(fscanf(in,"%d %s",&operation,s) != EOF)
	{
		
		if(operation==0)
			insert_word(w,0);
		if(operation==1)
			delete_word(w,0);
		if(operation==2)
			fprintf(out,"%d\n",NumberOfWords(w,0));
		if(operation==3)
			fprintf(out,"%d\n",NumberOfPrefixes(w,0));
	}
	fclose(in);
	fclose(out);
	return 0;
}