Cod sursa(job #1951896)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 3 aprilie 2017 20:53:11
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <cstdio>
#include <cstring>

using namespace std;

struct Nod
{
	Nod* vecini[27];
	int nrVecini;
	int nr;

	Nod()
	{
		nr = 0;
		nrVecini = 0;

		for(int i = 0; i < 27; i++)
		{
			vecini[i] = NULL;
		}
	}
};

Nod* root;
int operatie;
int lungimeCuvant;
char cuvant[25];

void citire()
{
	scanf("%d %s\n", &operatie, &cuvant);
	
	lungimeCuvant = strlen(cuvant);

	for(int i = 0; i < lungimeCuvant; i++)
	{
		cuvant[i] -= 'a' - 1;
	}
}

void adaugareNod(Nod *x, int poz)
{
	int ch = cuvant[poz];

	if(ch == 0)
	{
		x->nr++;
		return;
	}

	if(x->vecini[ch] == NULL)
	{
		x->vecini[ch] = new Nod;
		x->nrVecini++;
	}

	adaugareNod(x->vecini[ch], poz + 1);
}

int stergereNod(Nod *x, int poz)
{
	int ch = cuvant[poz];

	if(ch == 0)
	{
		x->nr--;
	}
	else if(stergereNod(x->vecini[ch], poz + 1) == 1)
	{
		x->nrVecini--;
		x->vecini[ch] = NULL;
	}

	if(x->nr == 0 && x->nrVecini == 0 && x != root)
	{
		delete x;
		return 1;
	}

	return 0;
}

int nrAparitii(Nod *x, int poz)
{
	int ch = cuvant[poz];

	if(ch == 0)
	{
		return x->nr;
	}

	if(x->vecini[ch] == 0)
	{
		return 0;
	}
	else
	{
		return nrAparitii(x->vecini[ch], poz + 1);
	}
}

int lungimePrefix(Nod *x, int poz)
{
	int ch = cuvant[poz];

	if(ch == 0 || x->vecini[ch] == NULL)
	{
		return poz;
	}

	return lungimePrefix(x->vecini[ch], poz + 1);
}

int main()
{
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);

	root = new Nod;

	while(!feof(stdin))
	{
		citire();

		switch(operatie)
		{
			case 0:
				adaugareNod(root, 0);
				break;
			case 1:
				stergereNod(root, 0);
				break;
			case 2:
				printf("%d\n", nrAparitii(root, 0));
				break;
			case 3:
				printf("%d\n", lungimePrefix(root, 0));
				break;
		}
	}
}