Cod sursa(job #1212909)

Utilizator pulseOvidiu Giorgi pulse Data 26 iulie 2014 14:43:02
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 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 add(Trie *nod, char *s)
{
	if (*s == '\n')
	{
		nod -> cnt++;
		return;
	}

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

	add(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 query(Trie *nod, char *s)
{
	if (*s == '\n')
		return nod -> cnt;

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

	return 0;
}

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

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

	char line[32];

	fgets(line, 32, stdin);

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

		fgets(line, 32, stdin);
	}

	return 0;
}