Cod sursa(job #1862058)

Utilizator Joystick6208Catalin Topala Joystick6208 Data 29 ianuarie 2017 14:59:40
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <cstdio>
#include <cstring>
using namespace std;

#define C (*s - 'a')

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

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

Trie *t = new Trie;

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

	if(!nod->fiu[C])
	{
		nod->fiu[C] = new Trie;
		nod->nrfii++;
	}

	ins(nod->fiu[C], s+1);
}

bool del(Trie *nod, char *s)
{
	if(*s == '\n')
		nod->cnt--;
	else if(del(nod->fiu[C], s+1))
	{
		nod->fiu[C] = 0;
		nod->nrfii--;
	}

	if(!nod->cnt && !nod->nrfii && nod != t)
	{
		delete nod;
		return 1;
	}

	return 0;
}

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

	return count(nod->fiu[C], s+1);
}

int pref(Trie *nod, char *s, int k)
{
	if(*s == '\n' || !nod->fiu[C])
		return k;

	return pref(nod->fiu[C], s+1, k+1);
}

int main()
{

	char linie[25];

	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);

	fgets(linie, 25, stdin);
	while(!feof(stdin))
	{
		switch(linie[0])
		{
			case '0': ins(t, linie+2);
					  break;
			case '1': del(t, linie+2);
					  break;
			case '2': printf("%d\n", count(t, linie+2));
					  break;
			case '3': printf("%d\n", pref(t, linie+2, 0));
					  break;
		}

		fgets(linie, 25, stdin);
	}

	return 0;
}