Cod sursa(job #800771)

Utilizator brainwashed20Alexandru Gherghe brainwashed20 Data 22 octombrie 2012 16:30:31
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<stdio.h>
#include<string.h>

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

Trie *T = new Trie;

#define ind (*sir - 'a')

void add(Trie *nod, char *sir) {
	if(*sir=='\n' || *sir==NULL) {
		nod->nr_aparitii++;
		return;
	}
	if(nod->fiu[ind]==NULL) {
		nod->fiu[ind] = new Trie;
		nod->nr_fii++;
	}
	add(nod->fiu[ind], sir+1);
}

int del(Trie *nod, char *sir) {
	if(*sir=='\n' || *sir==NULL) 
		nod->nr_aparitii--;
	else
		if(del(nod->fiu[ind],sir+1)) {
			nod->fiu[ind] = NULL;
			nod->nr_fii--;
		}
	
	if(nod->nr_aparitii==0 && nod->nr_fii==0 && nod!=T) {
		delete nod;
		return 1;
	}
	
	return 0;
}

int query(Trie *nod, char *sir) {
	if(*sir=='\n' || *sir==NULL)
		return nod->nr_aparitii;
	if(nod->fiu[ind]!=NULL)
		return query(nod->fiu[ind], sir+1);
	return 0;
}

int prefix(Trie *nod, char *sir, int val) {
	if((*sir=='\n' || *sir==NULL) || nod->fiu[ind]==NULL)
		return val;
	return prefix(nod->fiu[ind], sir+1, val+1);
}

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