Cod sursa(job #852093)

Utilizator enedumitruene dumitru enedumitru Data 10 ianuarie 2013 20:54:57
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <fstream>
#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[21];
    ifstream f("trie.in"); ofstream g("trie.out");
    for( ;!f.eof();f.get())
    {   f>>ce>>cuv;
        if(f.good())
        {   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';
        }
    }
    g.close(); return 0;
}