Cod sursa(job #1347047)

Utilizator ovidiuz98Zamfir Ovidiu ovidiuz98 Data 18 februarie 2015 19:23:40
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <fstream>
#define fiu f[*s-'a']
using namespace std;

ifstream fin("trie.in");
ofstream fout("trie.out");

char s[27];
struct trie{
    int nr,fii;
    trie *f[26];
    trie(){
        nr=fii=0;
        for(int i=0;i<26;i++)
            f[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 del(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(del(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(){
    int i,j,t;
    root=new trie;
    while(fin>>t>>s){
        if(t==0){
            update(root,s);
            continue;
        }
        if(t==1){
            del(root,s);
            continue;
        }
        if(t==2){
            fout<<query1(root,s)<<"\n";
            continue;
        }
        if(t==3){
            fout<<query2(root,s)<<"\n";
        }
    }
    fin.close();fout.close();
    return 0;
}