Cod sursa(job #1221858)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 21 august 2014 16:43:28
Problema Trie Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <fstream>
#define fiu p[*s-'a']
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

char s[26];
struct trie{
    int nr,fii;
    trie *p[26];
    trie(){
        fii=nr=0;
        for(int i=0;i<26;i++)   p[i]=NULL;
    }
};

trie *root;

void update(trie *r,char *s){
    if(*s){
        if(r->fiu==0){
            r->fiu=new trie;
            r->fii++;
        }
        update(r->fiu,s+1);
    }
    else
        r->nr++;
}

inline int clearup(trie *&r,char *s){
    if(*s==0){
        r->nr--;
        if(r->nr==0 && r->fii==0 && r!=root){
            delete r;
            r=NULL;
            return 1;
        }
        return 0;
    }
    if(clearup(r->fiu,s+1)){
        r->fii--;
        if(r->fii==0 && r->nr==0 && r!=root){
            delete r;
            r=NULL;
            return 1;
        }
    }
    return 0;
}

inline int query1(trie *r,char *s){
    if(*s==0){
        return r->nr;
    }
    if(r->fiu==NULL)
        return 0;
    return query1(r->fiu,s+1);
}

inline int query2(trie *r,char *s){
    if(r->fiu==NULL){
        return 0;
    }
    else
        return 1+query2(r->fiu,s+1);
}

int main(void){
    register int i,j,t;

    root=new trie;
    while(f>>t>>s){
        switch(t){
            case 0:
                update(root,s);
                break;
            case 1:
                clearup(root,s);
                break;
            case 2:
                g<<query1(root,s)<<"\n";
                break;
             default:
                g<<query2(root,s)<<"\n";
        }
    }
    return 0;
}