Cod sursa(job #2549495)

Utilizator MarcGrecMarc Grec MarcGrec Data 17 februarie 2020 18:59:27
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.73 kb
#define SIGMA 26

#include <fstream>
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

struct Nod
{
	int nrC = 0, nrF = 0;
	Nod* F[SIGMA] = {  };
} *rad = new Nod;

void Adauga(Nod* nod, char* cuv);
bool Scoate(Nod* nod, char* cuv);
int Numara(Nod* nod, char* cuv);
int Prefix(Nod* nod, char* cuv);

int main()
{
	int cer;
	char cuv[21];
	
	while (fin >> cer >> cuv)
	{
		switch (cer)
		{
			case 0:
			{
				Adauga(rad, cuv);
				break;
			}
			case 1:
			{
				Scoate(rad, cuv);
				break;
			}
			case 2:
			{
				fout << Numara(rad, cuv) << '\n';
				break;
			}
			case 3:
			{
				fout << (Prefix(rad, cuv) - 1) << '\n';
				break;
			}
			default:
			{
				break;
			}
		}
	}
	delete rad;
	
	fin.close();
	fout.close();
	return 0;
}

void Adauga(Nod* nod, char* cuv)
{
	if ((*cuv) == '\0')
	{
		++nod->nrC;
	}
	else
	{
		if (nod->F[(*cuv) - 'a'] == nullptr)
		{
			++nod->nrF;
			nod->F[(*cuv) - 'a'] = new Nod;
		}
		
		Adauga(nod->F[(*cuv) - 'a'], cuv + 1);
	}
}

bool Scoate(Nod* nod, char* cuv)
{
	if ((*cuv) == '\0')
	{
		--nod->nrC;
	}
	else
	{
		if (Scoate(nod->F[(*cuv) - 'a'], cuv + 1))
		{
			--nod->nrF;
			nod->F[(*cuv) - 'a'] = nullptr;
		}
	}
	
	if ((nod != rad) && (nod->nrF == 0) && (nod->nrC == 0))
	{
		delete nod;
		return true;
	}
	
	return false;
}

int Numara(Nod* nod, char* cuv)
{
	if ((*cuv) == '\0')
	{
		return nod->nrC;
	}
	
	return (nod->F[(*cuv) - 'a'] == nullptr) ? 0 : Numara(nod->F[(*cuv) - 'a'], cuv + 1);
}

int Prefix(Nod* nod, char* cuv)
{
	if ((*cuv) == '\0')
	{
		return 1;
	}
	
	return 1 + ((nod->F[(*cuv) - 'a'] == nullptr) ? 0 : Prefix(nod->F[(*cuv) - 'a'], cuv + 1));
}