Cod sursa(job #1300717)

Utilizator pavlov.ionPavlov Ion pavlov.ion Data 24 decembrie 2014 19:40:57
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.25 kb
#include<cstdio>
#include<cstring>
#define CH (*s-'a')
using namespace std;
//structura nodului
struct Trie{
	int cnt;
	int nr_fii;
	Trie *fiu[26];
	Trie(){
		cnt=nr_fii=0;
		memset(fiu,0,sizeof(fiu));
	}
};
Trie *T=new Trie;
void ins(Trie *nod,char *s) {
	if(*s=='\0'){
		nod->cnt++;
		return;
	}
	if(nod->fiu[CH]==0){
		nod->fiu[CH]=new Trie;
		nod->nr_fii++;
	}
  ins(nod->fiu[CH],s+1);
}
int del(Trie *nod,char *s) {
	if(*s=='\0')
		nod->cnt--;
	else if(del(nod->fiu[CH],s+1)){
			nod->fiu[CH]=0;
			nod->nr_fii--;
		 }
	if(nod->cnt==0 && nod->nr_fii==0 && nod!=T){
	delete nod;
	return 1;
	}
	return 0;
}
int que(Trie *nod,char *s){
	if(*s=='\0')
		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=='\0' || nod->fiu[CH]==0)
		return k;
	 return pre(nod->fiu[CH],s+1,k+1);
}
int main() {
	int op;
	char s[32];
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
	while(!feof(stdin)) {
        scanf("%d %s",&op,s);
		  switch(op){
				case 0:ins(T,s);
						break;
				case 1:del(T,s);
						break;
				case 2:printf("%d\n",que(T,s));
						break;
				case 3:printf("%d\n",pre(T,s,0));
						break;
		}
	}
return 0;
}