Cod sursa(job #1167180)

Utilizator SieRRa95FMI Stratulat Madalin-Gabriel SieRRa95 Data 4 aprilie 2014 15:32:36
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.47 kb
#include <iostream>
#include <cstring>
#include <fstream>
using namespace std;

//26 de litere mici.adica 26 de fii

class Nod{
public:
    int End;
    Nod *Fiu[26];
    int Nr_Fii;
    Nod(){
        Nr_Fii=0;
        End=0;
        memset(Fiu,0,sizeof(Fiu));
    }
};

class Trie{
private:
    Nod *Head;
protected:
    void Inserare(Nod *nod,char *s);
    int Find(Nod *nod,char *s);
    int Sterge(Nod *nod,char *s);
    int Prefix(Nod *nod,char *s,int lg);
public:
    Trie(){
        Head=new Nod;
    }
    void Inserare(char *s);
    int Find(char *s);
    void Sterge(char *s);
    int Prefix(char *s);
};

void Trie::Inserare(char *s){
    Inserare(Head,s);
}
void Trie::Inserare(Nod *nod,char *s){

    if(s[0]==0){
        nod->End++;

    }
    else{
        if(nod->Fiu[s[0]-'a']==NULL){
            nod->Fiu[s[0]-'a']=new Nod;
            nod->Nr_Fii++;
        }

        Inserare(nod->Fiu[s[0]-'a'],s+1);

    }
}

void Trie::Sterge(char *s){
    Sterge(Head,s);
}
int Trie::Sterge(Nod *nod,char *s){
    if(s[0]==0){
        nod->End--;
    }
    else
        if(Sterge(nod->Fiu[s[0]-'a'],s+1)){
            nod->Nr_Fii--;
            nod->Fiu[s[0]-'a']=0;
    }
    if(nod->End==0 && nod->Nr_Fii==0 && nod!=Head){
        delete nod;
        return 1;
    }
    return 0;

}

int Trie::Find(char *s){
    return Find(Head,s);
}
int Trie::Find(Nod *nod,char *s){
     if(s[0]==0){
        return nod->End;
     }

     if(nod->Fiu[s[0]-'a']!=NULL)
            Find(nod->Fiu[s[0]-'a'],s+1);
     else
        return 0;

}

int Trie::Prefix(char *s){
    return Prefix(Head,s,0);
}
int Trie::Prefix(Nod *nod,char *s,int lg){
    if(s[0]==0 || nod->Fiu[s[0]-'a']==0)
        return lg;
    return Prefix(nod->Fiu[s[0]-'a'],s+1,lg+1);
}

int main(){
    Trie A;
    int x;
    char s[30];
    ifstream f("trie.in");
    ofstream g("trie.out");
    f>>x;
    while(!f.eof()){
        if(f.eof()) break;
        if(x==0){
            f>>s;
            A.Inserare(s);
        }
            else if(x==2){
                f>>s;
                g<<A.Find(s)<<endl;
            }

                else if(x==1){
                    f>>s;
                    A.Sterge(s);
                }
                    else {
                        f>>s;
                        g<<A.Prefix(s)<<endl;
                    }

        f>>x;
    }
    f.close();
    g.close();

    return 0;
}