Cod sursa(job #645054)

Utilizator ELHoriaHoria Cretescu ELHoria Data 8 decembrie 2011 10:47:17
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include <cstdio>
#include <cstring>

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

char str[1<<5];
trie *T = new trie;

void inserare(trie *nod,char *s)
{
	while(*s!='\n')
	{
		if(nod->fiu[*s - 'a'] == 0) 
			nod->fiu[*s - 'a'] = new trie , nod->nrfii++;
		
		nod = nod->fiu[(*s++) - 'a']; 
	}
	nod->cnt++;
}

bool sterge(trie *nod,char *s)
{
	if(*s=='\n') nod->cnt--;
	else
		if(sterge(nod->fiu[*s - 'a'],s+1)) 
			nod->fiu[*s - 'a'] = 0 , nod->nrfii--;

	if(nod->nrfii == 0 && nod->cnt == 0 && nod != T) {
		delete nod; return 1;
	}
	return 0;
}

int prefix(trie *nod,char *s)
{	
	int ans = 0;
	while(*s !='\n' && nod->fiu[*s - 'a']) 
		nod = nod->fiu[(*s++) - 'a'] , ans++;

	return ans;
}

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

int main()
{
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);

	while(!feof(stdin)) {
		fgets(str,32,stdin);
		if(str[0] == '0') 
			inserare(T,str+2);
		else
		if(str[0] == '1') sterge(T,str+2);
		else
		printf("%d\n", str[0] == '2' ? query(T,str+2) : prefix(T,str+2));
	}

	return 0;
}