Cod sursa(job #751060)

Utilizator danieladDianu Daniela danielad Data 24 mai 2012 01:34:42
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 kb
#include<iostream>
#include<fstream>
#include<cstring>
#include<cstdio>
#define ch ( *lit-'a' )
using namespace std;
struct Trie{
	int nrcuv;
	int nrfii;
	Trie *fiu[27];
	Trie(){
		nrcuv=0;
		nrfii=0;
		memset(fiu,0,sizeof(fiu));
	}
};
Trie *T=new Trie;
void insereaza(Trie *cuv, char *lit){
	if(*lit=='\n'){
		cuv->nrcuv++;
		return;
	}
	if(cuv->fiu[ch]==0){
		cuv->fiu[ch]=new Trie;
		cuv->nrfii++;
	}
	insereaza(cuv->fiu[ch],lit+1);
}
int sterge(Trie *cuv,char *lit){
	if(*lit=='\n')
		cuv->nrcuv--;
	else
		if(sterge(cuv->fiu[ch],lit+1)){
			cuv->fiu[ch]=0;
			cuv->nrfii--;
		}
	if(cuv!=T && cuv->nrcuv==0 && cuv->nrfii==0){
		delete cuv;
		return 1;
	}
	return 0;
}
int nr_cuvinte(Trie *cuv,char *lit){
	if(*lit=='\n')
		return cuv->nrcuv;
	return nr_cuvinte(cuv->fiu[ch],lit+1);
	return 0;
}
int prefix(Trie *cuv,char *lit,int k){
	if(*lit=='\n' || !cuv->fiu[ch])
		return k;
	return prefix(cuv->fiu[ch],lit+1,k+1);
}
int main(){
	freopen("trie.in","r",stdin);
	freopen("trie.out","w",stdout);
  
    int r;
    char line[32];
    fgets(line, 32, stdin);
  
    while(!feof(stdin)){
        switch(line[0]){
          case '0': insereaza(T, line+2); break;
          case '1': sterge(T, line+2); break;
          case '2': r = nr_cuvinte(T, line+2), printf("%d\n", r); break;
          case '3': r = prefix(T, line+2, 0), printf("%d\n", r); break;
        }
        fgets(line, 32, stdin);
    }
  

    return 0;
}