Cod sursa(job #845259)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 30 decembrie 2012 18:05:23
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.43 kb
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;

#define LMAX 22
#define alfa 26

struct trie {
	int fii,nr;
	trie *urm[alfa];
};
typedef trie* TNOD;

TNOD rad;
char cuv[LMAX];

inline TNOD creare()
{
	TNOD aux;
	aux=new trie;
	aux->fii=0;
	aux->nr=0;
	memset(aux->urm,0,sizeof(aux->urm));
	return aux;
}

inline void adauga(char *s, TNOD p)
{
	if(*s=='\n') {
		p->nr++;		
		return ;
	}
	if(p->urm[*s-'a']==0) {
		p->urm[*s-'a']=creare();
		p->fii++;
	}
	adauga(s+1,p->urm[*s-'a']);
}

inline int sterge(char *s, TNOD p)
{
	if(*s=='\n') 
		p->nr--;
	else if(sterge(s+1,p->urm[*s-'a'])) {
		p->urm[*s-'a']=0;
		p->fii--;
	}
	if(p->fii==0 && p->nr==0 && p!=rad) {
		delete p;
		return 1;
	}
	return 0;
}

inline int cauta(char *s, TNOD p)
{
	if(*s=='\n')
		return p->nr;
	if(p->urm[*s-'a'])
		return cauta(s+1,p->urm[*s-'a']);
	return 0;
}

inline int prefix(char *s, TNOD p)
{
	if(*s=='\n')
		return 0;
	if(p->urm[*s-'a']!=0)
		return 1+prefix(s+1,p->urm[*s-'a']);
	else return 0;
}

int main ()
{
	int opt;
	ifstream f("trie.in");
	ofstream g("trie.out");
	rad=creare();
	while(f>>opt) {
		memset(cuv,0,sizeof(cuv));
		f>>cuv;
		cuv[strlen(cuv)]='\n';
		if(opt==0) 
			adauga(cuv,rad);
		else if(opt==1)
			sterge(cuv,rad);
		else if(opt==2) 
			g<<cauta(cuv,rad)<<'\n';
		else g<<prefix(cuv,rad)<<'\n';
	}
	f.close();
	g.close();
	return 0;
}