Cod sursa(job #2643361)

Utilizator dream3rDavid Pop dream3r Data 19 august 2020 16:43:45
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.36 kb
#include <cstdio>
#include <cstring>

#define CH (*s - 'a')

using namespace std;

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[CH] == 0)
	{
		nod->fiu[CH] = new Trie;
		nod->nrfii++;
	}

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

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

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

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

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

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

int main()
{
	char line[32];

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

	fgets(line, 32, stdin);

	while (!feof(stdin))
	{
		switch (line[0])
		{
		case '0': ins(T, line + 2); break;
		case '1': del(T, line + 2); break;
		case '2': printf("%d\n", que(T, line + 2)); break;
		case '3': printf("%d\n", pre(T, line + 2, 0)); break;
		}

		fgets(line, 32, stdin);
	}
	return 0;
}