Cod sursa(job #2165419)

Utilizator catalinlupCatalin Lupau catalinlup Data 13 martie 2018 12:10:24
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.25 kb
#include <bits/stdc++.h>
#define INFILE "trie.in"
#define OUTFILE "trie.out"
using namespace std;
ifstream in(INFILE);
ofstream out(OUTFILE);
struct Nod{
    int words;
    int nrfii;
    Nod *fii[26];
    Nod(){
        words=0;
        nrfii=0;
        memset(fii,0,sizeof(fii));
    }
};
class Trie{
public:
    Trie(){
        rad=new Nod;
    }
    void Inserare(char *s){
        ins(rad,s);
    }
    void Delete(char *s){
        del(rad,s);
    }
    int Prefix(char* s){
        return pre(rad,s,0);
    }
    int Words(char* s){
        return query(rad,s);
    }
    void ins(Nod*x,char*s){
        if(*s==NULL){
            x->words++;
            return;
        }
        if(x->fii[Tr(s)]==nullptr){
            x->nrfii++;
            x->fii[Tr(s)]=new Nod;
        }
        ins(x->fii[Tr(s)],s+1);
    }
    bool del(Nod*x,char*s){
        if(*s==NULL){
            x->words--;
        }
        else if(del(x->fii[Tr(s)],s+1)){
            x->fii[Tr(s)]=nullptr;
            x->nrfii--;
        }
        if(x->nrfii==0&&x!=rad&&x->words==0){
            delete x;
            return true;
        }
        return false;
    }
    int query(Nod*x,char*s){
        if(*s==NULL){
            return x->words;
        }
        if(x->fii[Tr(s)]!=nullptr){
            return query(x->fii[Tr(s)],s+1);
        }
        return 0;
    }
    int pre(Nod*x,char*s,int k){
        if(*s==NULL||x->fii[Tr(s)]==nullptr){
            return k;
        }
        return pre(x->fii[Tr(s)],s+1,k+1);
    }
private:
    Nod*rad;
    int Tr(char*s){
        return *s-'a';
    }
};

char*ConvertStringToChar(string s){
    char* chr;
    chr=new char[s.size()+1];
    for(int i=0;i<s.size();i++){
        chr[i]=s[i];
    }
    chr[s.size()]=NULL;
    return chr;
}

int main(){
    Trie tr;
    int tip;
    while(in>>tip){
        string str;
        in>>str;
        char*s=ConvertStringToChar(str);
        if(tip==0){
            tr.Inserare(s);
        }
        else if(tip==1){
            tr.Delete(s);
        }
        else if(tip==2){
            out<<tr.Words(s)<<"\n";
        }
        else if(tip==3){
            out<<tr.Prefix(s)<<"\n";
        }
    }
    return 0;
}