Cod sursa(job #1495826)

Utilizator ArkinyStoica Alex Arkiny Data 3 octombrie 2015 18:08:20
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.04 kb
#include<fstream>
#include<string.h>
using namespace std;

#define CODE(x) x-'a'
#define MAX 26
struct Node
{
	Node *e[MAX];
	int n_rep;
	int n_child;

	Node()
	{
		n_rep = 0;
		n_child = 0;
		memset(e, 0, sizeof(e));
	}

};

ifstream in("trie.in");
ofstream out("trie.out");

class Trie
{
	Node *tree;
	
	public:
		Trie();
		void add(const char *str);
		void remove(const char *str);
		int  count(const char *str);
		int  samePrefix(const char*str);

};
Trie::Trie()
{
	tree = new Node;
}
void Trie::add(const char *str)
{
	Node *q=tree;
	for (int i = 0;str[i] != '\0';++i)
	{
		if (!q->e[CODE(str[i])])
		{
			q->e[CODE(str[i])] = new Node;
			++q->n_child;
		}
		if(str[i+1]=='\0')
			++q->e[CODE(str[i])]->n_rep;
		q = q->e[CODE(str[i])];
	}
}

void Trie::remove(const char *str)
{
	Node *q = tree;
	Node *stack[20];
	int st = 0,i;
	stack[st++] = q;

	for (i = 0;str[i] != '\0' && q->e[CODE(str[i])];++i)
		stack[st++] = q->e[CODE(str[i])] , q= q->e[CODE(str[i])];

	if (str[i] == '\0')
	{
		--st;
		if (stack[st]->n_rep > 1)
		{
			--stack[st]->n_rep;
			return;
		}

		--stack[st]->n_rep;

		while (st >= 1 && stack[st]->n_child == 0 && stack[st]->n_rep==0 )
		{
			stack[st - 1]->e[CODE(str[st - 1])] = 0;
			delete stack[st];
			--stack[st - 1]->n_child;
			--st;
		}
		
	}

}
int Trie::count(const char *str)
{
	Node *q=tree;
	int i;
	for (i = 0;str[i] != '\0' && q->e[CODE(str[i])];++i)
		q = q->e[CODE(str[i])];

	if (str[i] == '\0')
		return q->n_rep;

	return 0;
}

int Trie::samePrefix(const char *str)
{
	Node *q = tree;
	int i,nr=0;
	for (i = 0;str[i] != '\0' && q->e[CODE(str[i])];++i)
		q = q->e[CODE(str[i])], ++nr;

	return nr;
}


int main()
{
	Trie trie;
	int i;
	char s[20];
	while (in >> i && in >> s)
	{
		switch (i)
		{
		case 0:
			trie.add(s);
			break;
		case 1:
			trie.remove(s);
			break;
		case 2:
			out<<trie.count(s)<<'\n';
			break;
			
		case 3:
			out << trie.samePrefix(s)<<'\n';
			break;
		}
	}

	return 0;
}