Cod sursa(job #1160657)

Utilizator gigel123Ionut. gigel123 Data 30 martie 2014 18:09:56
Problema Trie Scor 15
Compilator cpp Status done
Runda Arhiva educationala Marime 2.1 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=='\0'){
               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=='\0'){
            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 prefix(nod *x, char *s, int k){
        if(*s=='\0' || 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);
    }

    void aparitie(char *s){
        nod *v;
        v=r;
        int i;
        for(i=0;i<strlen(s);i++)
            if(v->f[s[i]-'a']) v=v->f[*(s+i)-'a'];
              else {
                g<<"0"<<endl;
                i=strlen(s)+2;
              }
        if(i!=strlen(s)+3) g<<v->c<<endl;
        }

};



int main()
{

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

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


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