Cod sursa(job #486230)

Utilizator S7012MYPetru Trimbitas S7012MY Data 20 septembrie 2010 19:50:53
Problema Trie Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 kb
/*
 * File:   main.cpp
 * Author: petru
 *
 * Created on 2010-09-20
 */


#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
#include <deque>
#include <set>
#include <bitset>
#include <cstring>
#define cat(s) (*(s)-'a')
using namespace std;

class trie{
	public:
        int cont,nrfii;
        trie *fiu[26];
		trie(){
		    cont=nrfii=0;
		    memset(fiu,0,sizeof(fiu));
        }
        void insert(trie *sursa, char *s);
        int del(trie*,char*);
        int query(trie*,char*);
        int prefix_comun(trie*,char*,int);


};
trie *t=new trie();

void trie::insert(trie *sursa,char *s) {
            if(*s=='\0') {
                ++sursa->cont;
                return;
            }
            if(!sursa->fiu[cat(s)]) {//n-a mai aparut litera s
                sursa->fiu[cat(s)]=new trie();
                ++sursa->nrfii;
            }
            sursa->insert(sursa->fiu[cat(s)],s+1);
}

int trie::del(trie *sursa,char *s) {
        if(*s=='\0') --sursa->cont;
        else if(sursa->del(sursa->fiu[cat(s)],s+1)) {
            sursa->fiu[cat(s)]=0;
            --sursa->nrfii;
        }
        if(!(sursa->cont) && !(sursa->nrfii) && sursa!=t) {
            delete sursa;
            return 1;
        }
        return 0;
}

int trie::query(trie *sursa, char *s) {
    if(*s == '\0') return sursa->cont;
    if(sursa->fiu[cat(s)]) return query(sursa->fiu[cat(s)], s+1 );
    return 0;
}

int trie::prefix_comun(trie *sursa, char *s,int lg) {
    if(*s=='\0'||sursa->fiu[cat(s)]==0) return lg;
    return prefix_comun(sursa->fiu[cat(s)],s+1,lg+1);
}

int n;

int main()
{
    int ce;
    char cuv[32];
	ifstream f("trie.in");
	ofstream g("trie.out");
	for( ;!f.eof();f.get()) {
	    f>>ce;
	    f>>cuv;
	    if(!ce) t->insert(t,cuv);
	    else if(ce==1) t->del(t,cuv);
	    else if(ce==2) g<<t->query(t,cuv)<<'\n';
	    else if(ce==3) g<<t->prefix_comun(t,cuv,0)<<'\n';
	}
	f.close();
	g.close();
	return 0;
}