Cod sursa(job #1067104)

Utilizator IonMosnoiIon Mosnoi IonMosnoi Data 26 decembrie 2013 12:55:55
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.5 kb
#include<fstream>
#include<string.h>

using namespace std;

struct node{
 int ap,nr;//ap -aparitii; nr - nr fii
 node *fii[30];
 
 node(){
 	ap =0; nr = 0;
        memset( fii, 0, sizeof( fii ) );
 }
};
node *trie1 = new node;



void adauga(node * nod,char *s){

	if(s[0]==0){
		nod->ap++;return;
	}
	
	if(!nod->fii[s[0]-'a']){
	   nod->fii[s[0]-'a'] = new node;
	   nod->nr++;
	}
	
	
	adauga(nod->fii[s[0]-'a'],s+1);
}


int sterge(node * nod , char *s){
	if(s[0]==0){
		nod->ap--;
	}else if (sterge(nod->fii[s[0]-'a'],s+1)){
		nod->nr--;
	    nod->fii[s[0]-'a']=0;
	}
	
	if(nod!=trie1 && nod->nr==0 && nod->ap==0){
		delete nod;
		return 1;
	}
	return 0;
}

int aparitii(node * nod,char *s){
	if(s[0]==0)return nod->ap;
	aparitii(nod->fii[s[0]-'a'],s+1);
}

int prefix(node * nod, char *s){
	if(s[0]==0 || nod->fii[s[0]-'a'] == 0) return 0;

	  return (prefix(nod->fii[s[0]-'a'],s+1) + 1);
}


main(){
  ifstream fin("trie.in");
  ofstream fout("trie.out"); 
   // freopen( "trie.in", "r", stdin );
   //freopen( "trie.out", "w", stdout );
  
  char s[30];
  int x;

  
  //while(!feof()){
 // fgets( s, 5, stdin );
 // }
 
  while(fin>>x>>s){
  	switch(x){
  		case 0:adauga(trie1,s); break;
  		case 1:sterge(trie1,s); break;
  		case 2:fout<<aparitii(trie1,s)<<"\n"; break;
  		case 3:fout<<prefix(trie1,s)<<"\n"; break;
  	}
  }
  
 // char go[]={'1','2','9'};
  
;
  
  //fgets( line, 32, stdin );
 
    fin.close(); fout.close();
  
}