Cod sursa(job #1655751)

Utilizator krityxAdrian Buzea krityx Data 18 martie 2016 11:57:15
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 2.29 kb
#include <fstream>
#include <vector>
#include <string>

using namespace std;

class TrieNode
{
public:
	unsigned int elementCount, nChildren;
	vector<TrieNode*> children;
	TrieNode()
	{
		elementCount = 0;
		nChildren = 0;
		children.resize(26);
	}
};

class Trie
{
public:
	TrieNode* root;
	Trie()
	{
		root = new TrieNode;
	}
	void Add(string s)
	{
		TrieNode* current = root;
		for (int i = 0; i < s.length(); i++)
		{
			int idx = s[i] - 97;
			if (current->children[idx])
			{
				current = (current->children[idx]);
			}
			else
			{
				TrieNode* node = new TrieNode;
				current->nChildren++;
				current->children[idx] = node;
				current = node;
			}
			if (i == s.length() - 1)
			{
				current->elementCount++;
			}
		}
	}

	void Remove(string s)
	{
		_remove(root, s, root);
	}

	int NumberOfOccurences(string s)
	{
		TrieNode* current = root;
		int i;
		for (i = 0; i < s.length(); i++)
		{
			int idx = s[i] - 97;
			if (current->children[idx])
			{
				current = current->children[idx];
			}
		}
		if (i == s.length())
		{
			return current->elementCount;
		}
	}

	int LogestCommonPrefix(string s)
	{
		TrieNode* current = root;
		int i;
		for (i = 0; i < s.length(); i++)
		{
			int idx = s[i] - 97;
			if (current->children[idx])
			{
				current = current->children[idx];
			}
			else
			{
				break;
			}
		}
		return i;
	}

private:
	bool _remove(TrieNode* node, string s, TrieNode* root)
	{
		TrieNode* current = node;
		for (int i = 0; i < s.length(); i++)
		{
			int idx = s[i] - 97;
			if (s[i] == '\n')
			{
				current->elementCount--;
			}
			else if (_remove(current->children[idx], s.substr(1), root))
			{
				current->children[idx] = NULL;
				current->nChildren--;
			}

			if (current->elementCount == 0 && current->nChildren == 0 && current != root)
			{
				delete current;
				return true;
			}
			return false;
		}
	}
};

int main()
{
	int x;
	string s;
	Trie t;
	ifstream f("trie.in");
	ofstream g("trie.out");
	while (f >> x >> s)
	{
		if (x == 0)
		{
			t.Add(s);
		}
		else if (x == 1)
		{
			t.Remove(s);
		}
		else if (x == 2)
		{
			g << t.NumberOfOccurences(s) << "\n";
		}
		else if (x == 3)
		{
			g << t.LogestCommonPrefix(s) << "\n";
		}
	}
	return 0;
}