Cod sursa(job #459191)

Utilizator darrenRares Buhai darren Data 28 mai 2010 11:52:05
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include<cstring>
#include<fstream>
#include<cstdlib>
using namespace std;

ofstream fout("trie.out");

struct trie
{
	char c;
	int v, p;
	trie *next[28];
	bool fiu[28];
};

trie *t = new trie;

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

int main()
{
	
	int op;
	char* cuv;
	t->v = t->p = 0;
	for (int i = 0; i < 28; ++i)
		t->fiu[i] = false;
	
	ifstream fin("trie.in");
	
	char test;
	while (true)
	{
		test = fin.peek();
		if (!isdigit(test))
			exit(0);
			
		fin >> op >> cuv;
		switch (op)
		{
		case 0:
			insert(cuv);
			break;
		case 1:
			erase(cuv);
			break;
		case 2:
			writen(cuv);
			break;
		case 3:
			writep(cuv);
			break;
		};
		fin.get(test);
	}
	
	return 0;
}

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

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

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

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