Cod sursa(job #2259925)

Utilizator adimiclaus15Miclaus Adrian Stefan adimiclaus15 Data 13 octombrie 2018 23:04:24
Problema Trie Scor 80
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.72 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;
}