Cod sursa(job #825130)

Utilizator AndreiRSStatescu Andrei Rares AndreiRS Data 27 noiembrie 2012 15:44:54
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <fstream>
#include <stdlib.h>
#include <algorithm>
#include <math.h>
using namespace std;


char S[26];
struct nod { nod *a[26]; int c, f; } *R;

void cre (nod *&n)
{
	n = new nod;
	for (int i = 0; i < 26; i++)
		n->a[i] = NULL;
	n->c = n->f = NULL;
}

void ins (nod *&n, char *p)
{
	if (*p == 0 || *p == '\n')
	{
		n->c ++;
		return;
	}
	
	char c = *p - 'a';
	if (n->a[c] == NULL)
	{
		cre (n->a[c]);
		n->f ++;
	}
	ins (n->a[c], p+1);
}

void del (nod *&n, char *p)
{
	if (*p == 0 || *p == '\n')
	{
		n->c --;
		return;
	}
	
	char c = *p - 'a';
	del (n->a[c], p+1);
	
	if (n->a[c]->f == 0 && n->a[c]->c == 0)
	{
		delete n->a[c];
		n->a[c] = NULL;
		n->f --;
	}
}

void que (nod *&n, char *p)
{
	if (*p == 0 || *p == '\n')
	{
		printf ("%d\n", n->c);
		return;
	}
	
	char c = *p - 'a';
	if (n->a[c] == NULL)
	{
		printf ("0\n");
		return;
	}
	que (n->a[c], p+1);
}

void pre (nod *&n, char *p)
{
	char c = *p - 'a';
	if (*p == '0' || *p == '\n' || n->a[c] == NULL)
		printf ("%d\n", p-S-2);
	else
		pre (n->a[c], p+1);
}

int main ()
{
	freopen ("trie.in", "r", stdin);
	freopen ("trie.out", "w", stdout);
	
	cre (R);
	while (fgets (S, 25, stdin))
	{
		switch (S[0] - '0')
		{
			case 0: ins (R, S+2); break;
			case 1: del (R, S+2); break;
			case 2: que (R, S+2); break;
			case 3: pre (R, S+2); break;
		}
	}
	return 0;
}