Cod sursa(job #470801)

Utilizator ooctavTuchila Octavian ooctav Data 15 iulie 2010 16:32:15
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;

const int LG_LIN = 50;

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

trie *T = new trie;

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

int sterge(trie *nod, char *s)
{
	if(*s == '\n')
		nod->cuv--;
	else if(sterge(nod->fiu[*s - 'a'], s + 1))
	{
		nod->fiu[*s - 'a'] = 0;
		nod->nr_fii--;
	}
	if(nod->cuv == 0 && nod->nr_fii == 0 && nod != T)
	{
		delete nod;
		return 1;
	}
	return 0;
}

int cuvant(trie *nod, char *s)
{
	if(*s == '\n')
		return nod->cuv;
	if(nod->fiu[*s - 'a'])
		return cuvant(nod->fiu[*s - 'a'], s + 1);
	return 0;
}

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

int main() 
{

	freopen("trie.in", "r", stdin);
	freopen("trie.out", "w", stdout);
	char line[LG_LIN];
	fgets(line, sizeof(line), stdin);
	while(!feof(stdin))
	{
		switch(line[0])
		{
			case '0': insera(T, line + 2);break;
			case '1': sterge(T, line + 2);break;
			case '2': printf("%d\n", cuvant(T, line + 2));break;
			case '3': printf("%d\n", prefix(T, line + 2, 0));break;
		}
		fgets(line, sizeof(line), stdin);
	}
	
	return 0;
}