Cod sursa(job #715864)

Utilizator d.andreiDiaconeasa Andrei d.andrei Data 17 martie 2012 21:16:52
Problema Trie Scor 45
Compilator cpp Status done
Runda Arhiva educationala Marime 1.83 kb
#include <cstdio>
#include <cstring>
#include <vector>
#include <fstream>
#include <iostream>
#include <string>

using namespace std;

#define file_in "trie.in"
#define file_out "trie.out"

#define sigma 26

class trie{
	
public:
	
	int nrc;
	int nrf;
	trie * f[sigma];
	trie();
};

trie::trie(){
	
	nrc=nrf=0;
	memset(f,0,sizeof(f));
}

void inserare_cuvant(char * cuvant, trie * T){
	
	int n=strlen(cuvant);
	for (int i=0;i<n;++i){
		
		int c=cuvant[i]-'a';
		if (T->f[c]!=NULL){
			T=T->f[c];
		}
		else{
			T->f[c]=new trie();
			T=T->f[c];
		}
		
		T->nrf++;
	}
	
	T->nrc++;
}

void stergere_cuvant(char * cuvant, trie * T){
	
	int n=strlen(cuvant);
	for (int i=0;i<n;++i){
		
		int c=cuvant[i]-'a';
		if (T->f[c]!=NULL){
			T=T->f[c];
		}		
		T->nrf--;
	}
	
	T->nrc--;
}


int numara_cuvant(char * cuvant, trie * T){
	
	int n=strlen(cuvant);
	for (int i=0;i<n;++i){
		
		int c=cuvant[i]-'a';
		if (T->f[c]!=NULL){
			T=T->f[c];
		}		
		else
			return 0;
	}
	
	return T->nrc;
}

int prefix_cuvant(char * cuvant, trie * T){
	
	int n=strlen(cuvant);
	int i=0;
	int c=cuvant[0]-'a';
	
	while(i<n && T->f[c]!=NULL && T->f[c]->nrf!=0){
		  if (T->f[c]!=NULL)
			  T=T->f[c];
		  i++;
		  c=cuvant[i]-'a';
	}
	
	return i;
}

int main(){
	
	trie T;
	
	//freopen(file_in,"r",stdin);
	//freopen(file_out,"w",stdout);
	
	ifstream f(file_in);
	ofstream g(file_out);
	
	while(!f.eof()){
		int Tip;
		char Cuvant[sigma];
		
		f>>Tip>>Cuvant;
		
		if (Tip==0){
			inserare_cuvant(Cuvant, &T);
			continue;
		}
		if (Tip==1){
			stergere_cuvant(Cuvant, &T);
			continue;
		}
		if (Tip==2){
			g<<numara_cuvant(Cuvant, &T)<<"\n";
			continue;
		}
		if (Tip==3){
			g<<prefix_cuvant(Cuvant, &T)<<"\n";
			continue;
		}
		Tip=4;
	}
	
	return 0;
}