Cod sursa(job #934039)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 30 martie 2013 14:13:39
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include<iostream>
#include<fstream>
#include<string.h>
using namespace std;

#define alfa 27
#define LMAX 22

struct Trie {
	int nr,fii;
	Trie *urm[alfa];
};
typedef Trie* T;

T rad;
char sir[LMAX];

T creare()
{
	T nou;
	nou=new Trie;
	nou->nr=0;
	nou->fii=0;
	memset(nou->urm,0,sizeof(nou->urm));
	return nou;
}

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

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

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

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

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