Cod sursa(job #2549478)

Utilizator MarcGrecMarc Grec MarcGrec Data 17 februarie 2020 18:42:38
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.7 kb
#define SIGMA 26

#include <fstream>
using namespace std;

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

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

void Adauga(Nod* nod, char* cuv);
void 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->Nf[(*cuv) - 'a'] == 0)
		{
			nod->F[(*cuv) - 'a'] = new Nod;
		}
		
		++nod->Nf[(*cuv) - 'a'];
		
		Adauga(nod->F[(*cuv) - 'a'], cuv + 1);
	}
}

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

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

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