Cod sursa(job #1342869)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 14 februarie 2015 16:46:09
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.56 kb
#include <fstream>
#define fiu p[*s-'a']
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");

char s[27];

struct trie{
    int nr,fii;
    trie *p[26];
    trie(){
        nr=fii=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->fii++;
            r->fiu=new trie;
        }
        update(r->fiu,s+1);
    }
    else
        r->nr++;
}

int stergere(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(stergere(r->fiu,s+1)){
        r->fii--;
        if(r->nr==0 && r->fii==0 && r!=root){
            delete r;
            r=NULL;
            return 1;
        }
    }
    return 0;
}

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

int query2(trie *r,char *s){
    if(*s==0 || r->fiu==NULL) return 0;
    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:
                stergere(root,s);
            break;
            case 2:
                g<<query1(root,s)<<"\n";
            break;
            default:
                g<<query2(root,s)<<"\n";
        }
    }
    return 0;
}