Cod sursa(job #1491447)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 25 septembrie 2015 15:21:03
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
using namespace std;
#define Lmax 25
#define ALF 26

struct trie
{
	int nr, nrfii;
	trie* fiu[ALF];
	
	trie()
	{
		nr = nrfii = 0;
		for(int i = 0; i < ALF; ++i) fiu[i] = NULL;
	}
} *rad;

char s[Lmax];

void insert(char*) ;
bool remove(trie*, char*) ;
int count(char*) ;
int prefix(char*) ;

int main()
{
    ifstream fin("trie.in");
    ofstream fout("trie.out");
    
    rad = new trie();
    
    while(fin.getline(s, Lmax))
	{
		switch(s[0])
		{
			case '0': insert(s + 2); break;
			case '1': remove(rad, s + 2); break;
			case '2': fout << count(s + 2) << '\n'; break;
			case '3': fout << prefix(s + 2) << '\n'; break;
		}
	}
	
    return 0;
}

void insert(char* s)
{
	trie *nod = rad;
	
	while(*s != '\0')
	{
		if(nod -> fiu[*s - 'a'] == NULL)
		{
			++(nod -> nrfii);
			nod -> fiu[*s - 'a'] = new trie();
		}
		
		nod = nod -> fiu[*s - 'a'];
		++s;
	}
	
	++(nod -> nr);
}


bool remove(trie* nod, char* s)
{
	if(*s != '\0')
	{
		if( remove(nod -> fiu[*s - 'a'], s + 1) )
		{
			nod -> fiu[*s - 'a'] = NULL;
			--(nod -> nrfii);
		}
		
		if((nod -> nrfii) == 0 && (nod -> nr) == 0 && nod != rad)
		{
			delete nod;
			return 1;
		}
		else return 0;
	}
	
	--(nod -> nr);
	if((nod -> nrfii) == 0 && (nod -> nr) == 0 && nod != rad)
	{
		delete nod;
		return 1;
	}
	
	return 0;
}

int count(char* s)
{
	trie *nod = rad;
	
	while(*s != '\0') nod = nod -> fiu[*s - 'a'], ++s;
	
	return nod -> nr;
}

int prefix(char* s)
{
	trie *nod = rad;
	int rez;
	
	for(rez = 0; *s != '\0' && (nod -> fiu[*s - 'a']) != NULL; ++s, ++rez)
		nod = nod -> fiu[*s - 'a'];
	
	return rez;
}