Cod sursa(job #478883)

Utilizator mathboyDragos-Alin Rotaru mathboy Data 20 august 2010 22:57:25
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <cstdio>
#include <cstring>
#include <string>

#define maxn 100010
#define W (*a - 'a')
struct TRIE
{
	int fr, nrs;
	TRIE *son[26];
	TRIE ()
	{
		fr = 0; nrs = 0;
		memset (son, 0, sizeof (son));
	}
};

using namespace std;

TRIE *trie = new TRIE;
int sum;
char s[maxn];
void insert (TRIE *node, char *a)
{
	if (*a == '\n') {
		node -> fr++;
		return ;
	}
	if (node -> son[W] == 0) {
		node -> son[W] = new TRIE;
		node -> nrs++;
	}
	insert (node -> son[W], a + 1);
}
bool del (TRIE *node, char *a)
{
	if (*a == '\n')
		node -> fr--;
	else if (del (node -> son[W], a + 1)) {
		node -> son[W] = 0;
		node -> nrs--;
	}
	if (node -> fr == 0 && node -> nrs == 0 && node != trie) {
		delete node; return 1;
	}
	return 0;
}
int query1 (TRIE *node, char *a)
{
	if (*a == '\n')
		return node -> fr;
	else query1 (node -> son[W], a + 1);
}

int query2 (TRIE *node, char *a)
{
	if (*a == '\n' || node -> son[W] == 0)
		return sum;
	sum += 1;
	query2 (node -> son[W], a + 1);
}

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

	fgets (s, maxn, stdin);

	while (!feof (stdin))
	{
		if (s[0] == '0') // insert
			insert (trie, s + 2);

		if (s[0] == '1') //erase
			del (trie, s + 2);
		if (s[0] == '2') //frequency
			printf ("%d\n", query1 (trie, s + 2));
		if (s[0] == '3') //lcp
			sum = 0, printf ("%d\n", query2 (trie, s + 2));
		fgets (s, maxn, stdin);
	}
	return 0;
}