Cod sursa(job #585354)

Utilizator BlaugranasEnal Gemaledin Blaugranas Data 28 aprilie 2011 23:04:55
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.35 kb
#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();
long y[26]={0};
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;
long i=0;
int main()
{
    int ce;
    char cuv[32];
    ifstream f("trie.in");
    ofstream g("trie.out");
    for( ;!f.eof();f.get()) {
        f>>ce;
        f>>cuv;
        i++;
        if(f.good()) {
            if(!ce) {t->insert(t,cuv);
                    y[*cuv-'a']++;}
            else if(ce==1) {t->del(t,cuv);
                           if(y[*cuv-'a']>0)
                                   y[*cuv-'a']--;}
            else if(ce==2) {if(i==70773||i==70777)
                                   printf("%ld %ld %d\n",i,y[*cuv-'a'],t->query(t,cuv));
                           g<<t->query(t,cuv)<<'\n';}
            else if(ce==3) 
                           g<<t->prefix_comun(t,cuv,0)<<'\n';
        }
    }
    f.close();
    g.close();
    return 0;
}