Cod sursa(job #645056)

Utilizator ELHoriaHoria Cretescu ELHoria Data 8 decembrie 2011 10:49:34
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 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'] , s++; 
	}
	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++ , s++;

	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);
	fgets(str,32,stdin);
	while(!feof(stdin)) {
		if(str[0] == '0') 
			inserare(T,str+2);
		else
		if(str[0] == '1') sterge(T,str+2);
		else
		if(str[0] == '2') printf("%d\n", query(T,str+2));
		else
		if(str[0] == '3') printf("%d\n",prefix(T,str+2));
		fgets(str,32,stdin);
	}

	return 0;
}