Cod sursa(job #641238)

Utilizator Robert29FMI Tilica Robert Robert29 Data 27 noiembrie 2011 16:55:04
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.29 kb
#include<stdio.h>
#include<string>
FILE*f=fopen("trie.in","r");
FILE*g=fopen("trie.out","w");
int sol,l;
char v[30];
struct trie{
	int nr,nrfii;
	trie *son[27];
	trie(){
		nr = nrfii = 0;
		for(int i=0;i<27;++i)
			son[i]=0;
	}
	
}  *p=new trie;


void insert(trie *nod,char *q){
	if(*q=='\n'){
		++nod->nr;
		return ;
	}
	if(nod->son[*q-'a'+1]==NULL){
		nod->son[*q-'a'+1]=new trie;
		++nod->nrfii;
	}
	insert(nod->son[*q-'a'+1],q+1);
}
int erase(trie *nod,char *q){
	if(*q=='\n'){
		--nod->nr;
	}else if(nod->son[*q-'a'+1])
		if(erase(nod->son[*q-'a'+1],q+1)){
			nod->son[*q-'a'+1]=NULL;
			--nod->nrfii;
		}
	if(!nod->nrfii&&!nod->nr&&nod!=p){
		delete nod;
		return 1;
	}
	return 0;
	
}
void appear(trie *nod,char *q){
	if(*q=='\n'){
		sol=nod->nr;
		return;
	}
	if(nod->son[*q-'a'+1])
		appear(nod->son[*q-'a'+1],q+1);
}
void pref(trie *nod,char *q){
	++l;
	if(*q>='a'&&*q<='z'&&nod->son[*q-'a'+1])
		pref(nod->son[*q-'a'+1],q+1);
	
	
}
int main(){
	
	while ( fgets(v+1,25,f)){
		if(v[1]=='0')
			insert(p,v+3);
		else if(v[1]=='1')
			erase(p,v+3);
		else if(v[1]=='2'){
			sol=0;
			appear(p,v+3);
			fprintf(g,"%d\n",sol);
		}else{
			l=-1;
			pref(p,v+3);
			fprintf(g,"%d\n",l);
		}
	}
	
	
	fclose(g);
	fclose(f);
	return 0;
}