Cod sursa(job #1212461)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 24 iulie 2014 19:17:11
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.71 kb
#include <fstream>
using namespace std;
ifstream fin("trie.in");
ofstream g("trie.out");

struct trie{
    int fii,nr;
    trie *f[26];
    trie(){
        fii=nr=0;
        for(register int i=0;i<=26;i++) f[i]=0;
    }
};

trie *root=new trie;

char s[25];

void update(trie *r,char *s){
    if(*s!=0){
        if(r->f[*s-'a']==0){
            r->f[*s-'a']=new trie;
            r->fii++;
        }
        update(r->f[*s-'a'],s+1);
    }
    else
        r->nr++;
}

int deleteword(trie *&r, char *s) {
    if (*s==0) {
        r->nr--;
        if (r->nr==0 && r->fii==0 && r!=root) {
            delete r;
            r=NULL;
            return 1;
        }
    } else {
        if (deleteword(r->f[*s-'a'],s+1)) {
            r->fii--;
            if (r->fii==0 && r->nr==0 && r!=root) {
                delete r;
                r=NULL;
                return 1;
            }
        }
    }

    return 0;
}

int query(trie *&r,char *s){
    if(*s==0)
        return r->nr;
    if(r->f[*s-'a']==NULL)
        return 0;
    return query(r->f[*s-'a'],s+1);
}

int prefix(trie *&r,char *s){
    if(*s==0)
        return 0;
    if(r->f[*s-'a']==NULL)
        return 0;
    return 1+prefix(r->f[*s-'a'],s+1);
}

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

    while(fin>>t>>s){
        switch(t){
            case 0:
                update(root,s);
                break;
            case 1:
                deleteword(root,s);
                break;
            case 2:
                g<<query(root,s)<<"\n";
                break;
            default:
                g<<prefix(root,s)<<"\n";
        }
    }

    fin.close();
    g.close();
    return 0;
}