Cod sursa(job #290366)

Utilizator cotofanaCotofana Cristian cotofana Data 27 martie 2009 20:20:14
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.27 kb
#include <stdio.h>
#include <string.h>
#define ch (*s-'a')

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

Trie *T=new Trie;

void ins(Trie *nod, char *s)
{
	if (*s=='\n')
	{
		nod->cnt++;
		return;
	}
	if (nod->fiu[ch]==0)
	{
		nod->fiu[ch]=new Trie;
		nod->nrfii++;
	}
	ins(nod->fiu[ch], s+1);
}

int del(Trie *nod, char *s)
{
	if (*s=='\n') nod->cnt--;
	else if (del(nod->fiu[ch], s+1))
	{
		nod->fiu[ch]=0;
		nod->nrfii--;
	}
	if (nod->cnt==0 && nod->nrfii==0 && nod!=T)
	{
		delete nod;
		return 1;
	}
	return 0;
}

int que(Trie *nod, char *s)
{
	if (*s=='\n') return nod->cnt;
	if (nod->fiu[ch]) return que(nod->fiu[ch], s+1);
	return 0;
}

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

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