Cod sursa(job #2232286)

Utilizator b10nd3Oana Mancu b10nd3 Data 18 august 2018 15:02:26
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.76 kb
#include<iostream>
#include<fstream>
#include<string>

using namespace std;

struct trie{
	int ap;
	trie *letter[28];
	
	trie(){
		ap=0;
		for(int i=0;i<=26;i++) 
		    letter[i]=NULL;
	}
} *root;


void adauga(string w){
   trie *current=root;
   current->ap++;
   
   for(int i=0;i<w.size();i++){
   	   if(current->letter[w[i]-'a']==NULL)
   	   	      current->letter[w[i]-'a']=new trie();
   	   current=current->letter[w[i]-'a'];
	   current->ap++;	      
   }	
}


void sterge(string w){
	trie  *current=root;
	current->ap--;
	
	for(int i=0;i<w.size();i++){
		current=current->letter[w[i]-'a'];
		current->ap--;
	}
}


int noAp(string w){
    int i, others=0; 
    trie *current=root;
   
	for(i=0;i<w.size();i++)
	     if(current->letter[w[i]-'a']==NULL)
		     return 0;
		 else 	  
	         current=current->letter[w[i]-'a'];
	for(i=0;i<26;i++)	
	   if(current->letter[i]!=NULL) others+=current->letter[i]->ap; 	
	
	return current->ap - others;
}


int lungComPrefix(string w){
	trie *current=root;
	int sol=0;
	
	for(int i=0;i<w.size();i++)
	   if(current->letter[w[i]-'a']==NULL || current->letter[w[i]-'a']->ap==0) return sol;
	   else {
	   	  sol++;
	   	  current=current->letter[w[i]-'a'];
	   }
	
	return sol;   
}


int main(){
	ifstream in("trie.in");
	FILE *out=fopen("trie.out","w");
	string word;
	
	int c;
	root=new trie();
	
	while(in>>c>>word){	
	    switch(c){
		   case(0):{
		   	adauga(word);
			break;
		   } 
		   case(1):{
		   	sterge(word);
			break;
		   }	
		   case(2):{
		   	 fprintf(out,"%i\n",noAp(word));
			break;
		   }    
		   case(3):{
		   	 fprintf(out,"%i\n",lungComPrefix(word));
			 break;
		   }	
	   }
	}
	
	in.close(); fclose(out);
	return 0;
}