Cod sursa(job #751052)

Utilizator paul24090FMI - Balauru Paul paul24090 Data 23 mai 2012 23:53:41
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include <cstdio>
#include <cstring>

using namespace std;

struct Trie 
{
	int nr_cuv, nr_fii;
	Trie *fiu[26];
	
	Trie() 
	{
		nr_cuv = 0, nr_fii = 0;
		memset(fiu, 0, sizeof (fiu));
	}
};

char line[32];
Trie *R = new Trie;

void add(Trie *nod, char *s) 
{	
	if(*s == '\n') 
	{
		nod -> nr_cuv++; 
		return;
	}
	if(nod -> fiu[*s - 'a'] == 0)
	{
		nod -> fiu[*s - 'a'] = new Trie;
		nod -> nr_fii++;
	}
	add(nod -> fiu[*s - 'a'], s + 1);
}

int del(Trie *nod, char *s)
 {
	if(*s == '\n')
		nod -> nr_cuv--;
	else if(del(nod -> fiu[*s - 'a'], s + 1))
	{
		nod -> fiu[*s - 'a'] = 0;
		nod -> nr_fii--;
	}
	if(!nod -> nr_cuv && !nod -> nr_fii && nod != R)
	{
		delete nod;
		return 1;
	}
	return 0;
}

int query(Trie *nod, char *s) 
{
	if(*s == '\n')
		return nod -> nr_cuv;
	if(!nod -> fiu[*s - 'a'])
		return 0;
	return query(nod -> fiu[*s - 'a'], s + 1);
}

int prefix(Trie *nod, char *s, int lg) 
{
	if (*s == '\n' || !nod -> fiu[*s - 'a'])
		return lg;
	return prefix(nod -> fiu[*s - 'a'], s + 1, lg + 1);
}

int main() 
{
	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	
	fgets(line, 32, stdin);
	while(!feof (stdin)) 
	{
		switch(line[0]) 
		{
			case '0': add(R, line + 2); break;
			case '1': del(R, line + 2); break;
			case '2': printf("%d\n", query(R, line + 2)); break;
			case '3': printf("%d\n", prefix(R, line + 2, 0)); break;
		}
		
		fgets(line, 32, stdin);
	}
	return 0;
}