Cod sursa(job #482154)

Utilizator ilincaSorescu Ilinca ilinca Data 2 septembrie 2010 17:53:58
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.09 kb
#include <cstdio>
#include <cstring>

#define x (*s)-'a'

struct Trie
{
	int nrfii, nra;
	Trie *f [26];
	Trie ()
	{
		nrfii=nra=0;
		memset (f, 0, sizeof (f));
	}
};

Trie *t=new Trie;

void ins (Trie *k, char *s)
{
	if (*s == '\n') {++k->nra; return;}
	if (k->f [x] == 0) {k->f [x]=new Trie; ++k->nrfii;}
	ins (k->f [x], s+1);
}

int del (Trie *k, char *s)
{
	if (*s == '\n') --k->nra;
	else if (del (k->f [x], s+1)) {--k->nrfii; k->f [x]=0;}
	if (k->nra == 0 && k->nrfii == 0 && k != t) return 1;
	return 0;
}

int nrap (Trie *k, char *s)
{
	if (*s == '\n') return k->nra;
	if (k->f [x] == 0) return 0;
	return nrap (k->f [x], s+1);
}

int pmax (Trie *k, char *s, int w)
{
	if (*s == '\n' || k->f [x] == 0) return w;
	return pmax (k->f [x], s+1, w+1);
}

int main ()
{
	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);
	char s [30];
	while (fgets (s, 105, stdin) != NULL)
	{
		switch (s [0])
		{
			case '0': ins (t, s+2); break;
			case '1': del (t, s+2); break;
			case '2': printf ("%d\n", nrap (t, s+2)); break;
			case '3': printf ("%d\n", pmax (t, s+2, 0)); break;	  
		}
	}
	return 0;
}