Cod sursa(job #2038732)

Utilizator robuvedVictor Robu robuved Data 13 octombrie 2017 22:47:11
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <fstream>
#include <string>
using namespace std;

ifstream in("trie.in");
ofstream out("trie.out");
#define MAX ('z' - 'a' + 1)
struct Node 
{
	Node* children[MAX];
	int count;
	int count_children;
	Node()
	{
		count = 0;
		count_children = 0;
		for (int i = 0; i < MAX; i++)
		{
			children[i] = nullptr;
		}
	}
};
Node *root = new Node;
void InsertWord(string word)
{
	Node *p = root;
	for (auto it = word.begin(); it != word.end(); it++)
	{
		int index = *it - 'a';
		if (p->children[index] == nullptr)
		{
			p->children[index] = new Node();
			p->count_children++;
		}
		p = p->children[index];
	}
	p->count++;
}
void DeleteWord(string word, int i = 0, Node* &p = root)
{
	if (i == word.size())
	{
		p->count--;
	}
	else
	{
		int index = word[i] - 'a';
		DeleteWord(word, i + 1, p->children[index]);
		if (p->children[index] == nullptr) p->count_children--;
	}
	if (p != root && p->count == 0 && p->count_children == 0)
	{
		delete p;
		p = nullptr;
	}
}
int CountWord(string word)
{
	Node *p = root;
	for (auto it = word.begin(); it != word.end(); it++)
	{
		int index = *it - 'a';
		if (p->children[index] == nullptr)
			return 0;
		p = p->children[index];
	}
	return p->count;
}
int LongestPrefix(string word)
{
	Node *p = root;
	auto it = word.begin();
	for (; it != word.end() && p->children[*it - 'a']; it++)
	{
		p = p->children[*it - 'a'];
	}
	int longest = it - word.begin();
	return longest;
}
int main()
{
	int opt;
	string word;
	int count_mod = 0;
	while (in >> opt >> word)
	{
		switch (opt)
		{
		case 0:
			InsertWord(word);
			break;
		case 1:
			DeleteWord(word);
			break;
		case 2:
			out << CountWord(word) << '\n';
			break;
		case 3:
			out << LongestPrefix(word) << '\n';
			break;
		}
	}
}