Cod sursa(job #934059)

Utilizator SebiSebiPirtoaca George Sebastian SebiSebi Data 30 martie 2013 14:18:53
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.46 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']==0)  {
		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;
	if(p->urm[*s-'a'])
		return cauta(p->urm[*s-'a'],s+1);
	return 0;
}

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