Cod sursa(job #2078442)

Utilizator calin1Serban Calin calin1 Data 29 noiembrie 2017 16:30:23
Problema Trie Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <cstdio>
#include <cstring>

using namespace std;

char sir[25];

int l;

class Nod
{
public:
	int nr, nr_sons;
	
	Nod *vec[30];
	
	Nod();
};

Nod :: Nod()
{
	nr = 0;
	
	nr_sons = 0;
	
	for(int i = 0 ; i <= 26 ; ++i)
	{
		vec[i] = NULL;
	}
}

class Trie
{
private:
	Nod *root;
	
public:
	Trie();
	void insert(int poz);
	void insert(Nod *n, int poz);
	
	void find(int poz);
	void find(Nod *n, int poz);
	
	int del(int poz);
	int del(Nod *n, int poz);
	
	void prefix(int poz);
	void prefix(Nod *n, int poz);
};

Trie :: Trie()
{
	root = new Nod; 
}

Trie *tree = new Trie;

void Trie :: insert(int poz)
{
	insert(root, poz);
}

void Trie :: insert(Nod *n, int poz)
{
	if(poz == l)
	{
		n->nr++;
		return;
	}
	
	if(n->vec[sir[poz] - 'a'] == NULL)
	{
		n->vec[sir[poz] - 'a'] = new Nod;
		
		n->nr_sons++;
	}
	
	insert(n->vec[sir[poz] - 'a'], poz + 1);
}

void Trie :: find(int poz)
{
	find(root, poz);
}

void Trie :: find(Nod *n, int poz)
{
	if(poz == l)
	{
		printf("%d\n",n->nr);
		return;
	}
	
	if(n->vec[sir[poz] - 'a'])
	{
		find(n->vec[sir[poz] - 'a'], poz + 1);
	}
	else
	{
		printf("0\n");
	}
}

int Trie :: del(int poz)
{
	del(root, poz);
}

int Trie :: del(Nod *n, int poz)
{
	if(poz == l)
	{
		n->nr--;
	}
	else
	{
		if(del(n->vec[sir[poz] - 'a'], poz + 1))
		{
			n->vec[sir[poz] - 'a'] = NULL;
			n->nr_sons--;
		}
	}
	
	if(!n->nr_sons && !n->nr && n != root)
	{
		delete n;
		return 1;
	}
	
	return 0;
}

void Trie :: prefix(int poz)
{
	prefix(root, poz);
}

void Trie :: prefix(Nod *n, int poz)
{
	if(n->vec[sir[poz] - 'a'])
	{
		prefix(n->vec[sir[poz] - 'a'], poz + 1);
	}
	else
	{
		printf("%d\n", poz);
	}
}

void citire()
{
	int caz;
	
	while(!feof(stdin))
	{
		scanf("%d %s\n", &caz, &sir);
		
		l = strlen(sir);
		
		switch(caz)
		{
			case 0: tree->insert(0); break;
			case 1: tree->del(0); break;
			case 2: tree->find(0); break;
			case 3: tree->prefix(0); break;
		}
	}
	
	printf("\n");
}

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