Cod sursa(job #459203)

Utilizator darrenRares Buhai darren Data 28 mai 2010 13:08:21
Problema Trie Scor 70
Compilator cpp Status done
Runda Arhiva educationala Marime 2.26 kb
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<bitset>
using namespace std;

struct trie
{
	int v, p;
	trie *next[26];
	bitset<26> fiu;
	trie()
	{
		v = p = 0;
		fiu.reset();
	}
};

trie *t = new trie;

void insert(char* cuv);
void erase(char* cuv);
void writen(char* cuv);
void writep(char* cuv);

int main()
{
	freopen("trie.out", "w", stdout);
	freopen("trie.in", "r", stdin);
	
	char line[32];
	fgets(line, 32, stdin);

	while (!feof(stdin))
	{
		
		switch (line[0] - '0')
		{
		case 0:
			insert(line + 2); break;
		case 1:
			erase(line + 2); break;
		case 2:
			writen(line + 2); break;
		case 3:
			writep(line + 2); break;
		};
		fgets(line, 32, stdin);
	}
	return 0;
}

void insert(char* cuv)
{
	trie *aux =  new trie;
	aux = t;
	for (int i = 0; i < (int)strlen(cuv) - 1; ++i)
	{
		if (aux->fiu[cuv[i] - 'a'] == 1)
		{
			aux = aux->next[cuv[i] - 'a'];
		}
		else
		{
			trie *nod = new trie;
			aux->next[cuv[i] - 'a'] = nod;
			aux->fiu[cuv[i] - 'a'] = 1;
			aux = nod;
		}
		++aux->p;
	}
	++aux->v;
}

void erase(char* cuv)
{
	trie *aux = new trie, *aux2 = new trie;
	aux = t;
	for (int i = 0; i < (int)strlen(cuv) - 1; ++i)
	{
		aux = aux->next[cuv[i] - 'a'];
		--aux->p;
	}
	--aux->v;
	if (aux->v == 0)
	{
		aux = t;
		for (int i = 0; i < (int)strlen(cuv) - 1; ++i)
		{
			aux2 = aux->next[cuv[i] - 'a'];
			if (aux2->p == 0)
			{
				aux->fiu[cuv[i] - 'a'] = 0;
				aux = aux->next[cuv[i] - 'a'];
				for (int j = i + 1; j < strlen(cuv) - 1; ++j)
				{
					aux2 = aux;
					aux = aux->next[cuv[j] - 'a'];
					delete aux2;
				}
				delete aux;
				break;
			}
			aux = aux->next[cuv[i] - 'a'];
		}
	}
}

void writen(char* cuv)
{
	trie *aux = new trie;
	aux = t;
	for (int i = 0; i < (int)strlen(cuv) - 1; ++i)
		if (aux->fiu[cuv[i] - 'a'] == 1)
			aux = aux->next[cuv[i] - 'a'];
		else
		{
			printf("0\n");
			return;
		}
	printf("%d\n", aux->v);
}

void writep(char* cuv)
{
	trie *aux = new trie;
	aux = t;
	
	int cont = 0, mx = 0;
	for (int i = 0; i < (int)strlen(cuv) - 1; ++i)
	{
		++cont;
		if (aux->fiu[cuv[i] - 'a'] == 1)
			aux = aux->next[cuv[i] - 'a'];
		else
			break;
		
		if (aux->p > 0)
			mx = cont;
	}
	printf("%d\n", mx);
}