Cod sursa(job #2723052)

Utilizator zerolightningIon Bobescu zerolightning Data 13 martie 2021 15:13:35
Problema Trie Scor 55
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.03 kb
#include <iostream>
#include <fstream>

using namespace std;

// 26 chars
struct node
{
	int aparitii;
	int childCount;
	node* children[26];

	node() : children()
	{
		aparitii = childCount = 0;
	}

	node* getGhild(char c)
	{
		return children[c - 'a'];
	}
	node* createChild(char c)
	{
		childCount++;
		children[c - 'a'] = new node();
		return children[c - 'a'];
	}
	void removeChild(char c)
	{
		delete children[c - 'a'];
		children[c - 'a'] = 0;
		childCount--;
	}
};

node* root = new node();

void add(string& s)
{
	
	node* test = root;
	int sz = s.size();
	for (int i = 0; i < sz; i++)
	{
		node* child = test->getGhild(s[i]);
		if (!child)
		{
			test = test->createChild(s[i]);
		}
		else
		{
			test = child;
		}
	}
	test->aparitii++;
}
void remove(string& s)
{

	node* test = root;
	int sz = s.size();
	for (int i = 0; i < sz - 1; i++)
	{
		node* child = test->getGhild(s[i]);
		test = child;
	}
	node* child = test->getGhild(s[sz - 1]);
	if (child->aparitii == 1 && child->childCount == 0)
	{
		test->removeChild(s[sz - 1]);
	}
	else
	{
		child->aparitii--;
	}
}

int getAparitii(string& s)
{
	node* test = root;
	int sz = s.size();
	for (int i = 0; i < sz ; i++)
	{
		node* child = test->getGhild(s[i]);
		if (!child) return 0;
		test = child;
	}
	return test->aparitii;
}
int prefix(string& s)
{
	int k = 0;
	node* test = root;
	int sz = s.size();
	for (int i = 0; i < sz; i++)
	{
		node* child = test->getGhild(s[i]);
		if (!child)
		{
			return k;
		}
		k++;
		test = child;
	}
	return s.size();
}


int main()
{
	ifstream f("trie.in");
	ofstream g("trie.out");
	// Program
	string s;
	int x;
	s.resize(21);
	while (f >> x >> s)
	{
		switch (x)
		{
		case 0: {
			add(s);
			break;
		}
		case 1: {
			remove(s);
			break;
		}
		case 2: {
			g << getAparitii(s) << '\n';
			break;
		}
		case 3: {
			g << prefix(s) << '\n';
			break;
		}
		default:
			break;
		}
	}


	// Exit
	f.close();
	g.close();
	return 0;
}