Cod sursa(job #1212668)

Utilizator vasile_pojogaPojoga Vasile vasile_pojoga Data 25 iulie 2014 15:30:49
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
#include <fstream>
#include <cstring>
#include <string>

using namespace std;

struct Trie 
{
	int count, nrChilds;
	Trie *child[26]; 
	Trie() 
	{
		count = nrChilds = 0;
		memset(child, 0, sizeof(child));
	}
};

Trie *T = new Trie;

void solve();
void insert(Trie *node, const char *word);
bool del(Trie *node, const char *word);
int appearances(Trie *node, const char *word);
int prefix(Trie *node, const char *word);
inline int pos(char c){return c-'a';}


int main()
{
	solve();
	return 0;
}

void solve()
{
	ifstream fin("trie.in");
	ofstream fout("trie.out");
	int o;
	string word;
	while(!fin.eof())
	{
		fin>>o;
		fin>>word;
		switch (o)
		{
		case 0:
			insert(T,word.c_str());
			break;
		case 1:
			del(T,word.c_str());
			break;
		case 2:
			fout<<appearances(T,word.c_str())<<'\n';
			break;
		case 3:
			fout<<prefix(T,word.c_str())<<'\n';
			break;
		default:
			break;
		}
	}
}

void insert(Trie *node, const char *word)
{
	if(*word == '\0')
	{
		node->count++;
		return;
	}
	else
	{
		if(node->child[pos(*word)] == 0)
		{
			node->child[pos(*word)] = new Trie;
			node->nrChilds++;
		}
		insert(node->child[pos(*word)], word+1);
	}
}

bool del(Trie *node, const char *word)
{
	if(*word == '\0')
	{
		node->count--;
	}
	else if(del(node->child[pos(*word)], word+1))
	{
		node->child[pos(*word)] = 0;
		node->nrChilds--;
	}
	if(node->count == 0 && node->nrChilds == 0 && node != T)
	{
		delete node;
		return true; //was deleted a node
	}
	else
	{
		return false; //wasn't deleted a node
	}
}

int appearances(Trie *node, const char *word)
{
	if(*word == '\0')
	{
		return node->count;
	}
	else if(node->child[pos(*word)] != 0)
	{
		return appearances(node->child[pos(*word)], word+1);
	}
	else
	{
		return 0;
	}
}

int prefix(Trie *node, const char *word)
{
	if(*word == '\0' || node->child[pos(*word)] == 0)
	{
		return 0;
	}
	else
	{
		return 1 + prefix(node->child[pos(*word)], word+1);
	}
}