Cod sursa(job #1341610)

Utilizator soriynSorin Rita soriyn Data 12 februarie 2015 22:26:20
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<iostream>
#include<cstring>
#include<fstream>
#define CH (*s-'a')

using namespace std;

struct Trie
{
	int cnt, nrFii;
	Trie *fiu[26];

	Trie()
	{
		cnt = nrFii = 0;
		memset(fiu, 0, sizeof(Trie));
	}
};

Trie *T = new Trie;

void insertNode(Trie *nod, char *s)
{
	if (*s == '\0')
	{
		nod->cnt++;
		return;
	}

	if (nod->fiu[CH] == 0)
	{
		nod->fiu[CH] = new Trie;
		nod->nrFii++;
	}
	insertNode(nod->fiu[CH], s + 1);
}

int deleteNode(Trie *nod, char *s)
{
	if (*s == '\0')
		nod->cnt--;

	/*daca nodul nu mai are fii*/
	else if (deleteNode(nod->fiu[CH], s + 1)) 
	{
		nod->fiu[CH] = 0;
		nod->nrFii--;
	}

	if (nod->cnt == 0 && nod->nrFii == 0 && nod != T && nod)
	{
		delete nod;
		return 1;
	}
	return 0;
}

int queryApparences(Trie *nod, char *s)
{
	if (*s == '\0')
		return nod->cnt;

	if (nod->fiu[CH])
		return queryApparences(nod->fiu[CH], s + 1);

	return 0;
}

int queryMaxPrefix(Trie *nod, char *s, int k)
{
	if (*s == '\0' || !nod->fiu[CH])
		return k;
	if (nod->fiu[CH])
	{
		return queryMaxPrefix(nod->fiu[CH], s + 1, k + 1);
	}
}

int main()
{
	ifstream in("trie.in");
	ofstream out("trie.out");

	char line[100];
	while (in.getline(line,50))
	{
		if (line[0] == '0')
			insertNode(T, line + 2);
		else if (line[0] == '1')
			deleteNode(T, line + 2);
		else if (line[0] == '2')
			out<<queryApparences(T, line +2)<<"\n";
		else
			out<<queryMaxPrefix(T, line + 2, 0)<<"\n";
	}
}