Cod sursa(job #239948)

Utilizator catalina5catalina serban catalina5 Data 6 ianuarie 2009 15:02:00
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include<iostream>
#include<fstream>
#include<string.h>

using namespace std;

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

char s[30];

struct trie {
    int ap,fii;
    trie *vfii[ 26 ];
    trie() {
        ap=0;
        fii=0;
        memset(vfii,0,sizeof(vfii));
    }
};

trie *rad=new  trie;

void aadaugare(trie *a,int i){
    if(s[i]=='\n'){
        a->ap++;
        return;
    }
    int x=s[i]-'a';
    if(a->vfii[x]==0){
        a->vfii[x]=new trie;
        a->fii++;
    aadaugare(a->vfii[x],i+1);
    }
}

int stergere(trie *a,int i){
    if(s[i]=='\n')
        a->ap--;
    else
    if(stergere(a->vfii[s[i]-'a'],i+1)){
        a->vfii[s[i]-'a']=0;
        a->fii--;
    }

    if(a->ap==0&&a->fii==0&&a!=rad){
        delete a;
        return 1;
    }

    return 0;
}


int nr_ap( trie *a,int i) {
    if(s[i]=='\n' )
        return a->ap;

    if(a->vfii[s[i]-'a'])
        return nr_ap(a->vfii[s[i]-'a'],i+1);

    return 0;
}

int prefix_max(trie *a,int i){
    if((s[i]=='\n')||(!a->vfii[s[i]-'a']))
        return 0;

    return prefix_max(a->vfii[s[i]-'a'],i+1)+1;
}

int main(){
      while (!fin.eof()){
          fin.getline(s,30);
          if(s[0]=='0')
               aadaugare(rad,2);
          else
         if(s[0]=='1')
                stergere(rad,2);
         else
           if(s[0]=='2')
                fout<<nr_ap(rad,2)<<"\n";
           else
           if(s[0]=='0')
                fout<<prefix_max(rad,2)<<"\n";
      }
    return 0;
}