Cod sursa(job #1160675)

Utilizator gigel123Ionut. gigel123 Data 30 martie 2014 18:20:54
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <cstring>
#include<fstream>
#include<cstdio>

#define l (*s - 'a')

using namespace std;

ifstream f("trie.in");
ofstream g("trie.out");


class nod{
    int c,nrf;
    nod *f[26];
public:
    nod(){
        c=nrf=0;
        memset(f,0,sizeof(f));
    }
    friend class trie;
};

class trie{
    nod *r;

    void inserare(nod *x,char *s){
        if(!*s){
               x->c++;
               return;
        }

        if(!x->f[l]){
            x->nrf++;
            x->f[l]=new nod;
        }

        inserare(x->f[l],(s+1));
    }

    int sterge(nod *x,char *s){
        if(!*s){
            x->c--;
        }
        else if(sterge(x->f[l],(s+1))){
                x->nrf--;
                x->f[l]=0;
            }
        if(x->c==0 && x->nrf==0 && x!=r){
            delete (x);
            return 1;
        }
        return 0;
    }

    int aparitie(nod *x, char *s){
        if(s[0]=='\0'){
            return x->c;
        }
        if(x->f[s[0]-'a'])return aparitie(x->f[s[0]-'a'],(s+1));
        return 0;
    }


    int prefix(nod *x, char *s, int k){
        if(!*s || x->f[l]==0) return k;
        return prefix(x->f[l], (s+1), k+1);
    }



public:
    trie(){
        r=new nod;
    }
    void start_ins(char *sir){
         inserare(r,sir);
    }
    int start_sterge(char *sir){
        return sterge(r,sir);
    }
    int start_ap(char *sir){
        return aparitie(r,sir);
    }
    int start_prefix(char *sir,int k){
        return prefix(r,sir,k);
    }



};



int main()
{

    trie d;
    char s[20];
    int opt;

    f>>opt;
    while(f.get()!=EOF){
        f>>s;
        if(opt==0)d.start_ins(s);
        else if(opt==1)d.start_sterge(s);
        else if(opt==2)g<<d.start_ap(s)<<endl;
        else g<<d.start_prefix(s,0)<<endl;
        f>>opt;
    }




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