Cod sursa(job #424491)

Utilizator slayer4uVictor Popescu slayer4u Data 24 martie 2010 21:39:17
Problema Trie Scor 5
Compilator cpp Status done
Runda Arhiva educationala Marime 2.21 kb
#include <cstdio>
#include <vector>
using namespace std;
vector <int> trie[100000];

long nNodes, n, code;
char word[25];

void addWord(long node, long position)
{
	long letter = word[position] - 'a' + 2;
	if (!trie[node][letter])
	{
		trie[++nNodes].push_back(0);
		trie[nNodes].push_back(1);
		trie[node][letter] = nNodes;
		for (long i = 1; i <= 26; ++i)
			trie[nNodes].push_back(0);
		if (position == n - 1)
			++trie[nNodes][0];
		else
			addWord(nNodes, position + 1);
	}
	else
	{
		++trie[node][1];
		if (position == n - 1)
			++trie[trie[node][letter]][0];
		else
		{
			addWord(trie[node][letter], position + 1);
			++trie[trie[node][letter]][1];
		}
	}
}

void deleteWord(long node, long position)
{
	long letter = word[position] - 'a' + 2;
	
	if (!trie[node][letter])
		return;
	else
	{
		if (position == n - 1)
		{
			--trie[trie[node][letter]][0];
			--trie[trie[node][letter]][1];
			if (!trie[trie[node][letter]][1])
				trie[node][letter] = 0;
		}
		else
		{
			deleteWord(trie[node][letter], position + 1);
			--trie[trie[node][letter]][1];
			if (!trie[trie[node][letter]][1])
				trie[node][letter] = 0;
		}
	}
}

long query1(long node, long position)
{
	long letter = word[position] - 'a' + 2;

	if (!trie[node][letter])
		return 0;
	else
	{
		if (position == n - 1)
			return trie[trie[node][letter]][0];
		else
			query1(trie[node][letter], position + 1);
	}

}

long query2(long node, long position)
{
	long letter = word[position] - 'a' + 2;
	
	if (!trie[node][letter])
		return position;
	else
	{
		if (position == n - 1)
			return position + 1;
		query2(trie[node][letter], position + 1);
	}
}

int main()
{
	freopen ("trie.in", "rt", stdin);
	freopen ("trie.out", "wt", stdout);

	for (long i = 1; i <= 28; ++i)
		trie[0].push_back(0);

	while (scanf("%ld %s", &code, word) != EOF)
	{
		n = strlen(word);
		switch (code)
		{
			case 0: 
				{
					addWord(0, 0);
					break;
				}

			case 1: 
				{
					deleteWord(0, 0);
					break;
				}

			case 2: 
				{
					printf("%ld\n", query1(0, 0));
					break;
				}

			case 3: 
				{
					printf("%ld\n", query2(0, 0));
					break;
				}
		}
	}

	return 0;
}