Cod sursa(job #1086622)

Utilizator oprea1si2si3Oprea Sebastian oprea1si2si3 Data 18 ianuarie 2014 13:35:51
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include<fstream>
#include<iostream>
using namespace std;

struct nod{
 int ap,nr;
 nod *fii[30];

 nod(){
    ap =0; nr = 0;
        for(int i=0;i<=30;i++)
            fii[i]=0;
 }
};
nod *trie=new nod;

void adauga_nod(nod *node,char *s){

    if(s[0]==0){
        node->ap++;return;
    }
    if(!node->fii[s[0]-'a']){
       node->fii[s[0]-'a'] = new nod;
       node->nr++;
    }

    adauga_nod(node->fii[s[0]-'a'],s+1);
}

int sterge_nod(nod *node,char *s) {
    if(s[0]==0)
        node->ap--;

    else
    if(sterge_nod(node->fii[s[0]-'a'],s+1)) {
        node->nr--;
        node->fii[s[0]-'a']=0;
    }

    if(node!=trie && node->nr==0 && node->ap==0) {
        delete node;
        return 1;
    }
    return 0;
}

int aparitii_nod(nod * node,char *s){

    if(s[0]==0)return node->ap;
    if(node->fii[s[0]-'a']==0)return 0;
    aparitii_nod(node->fii[s[0]-'a'],s+1);
}

int cmlpc(nod * node, char *s){
    if(s[0]==0 || node->fii[s[0]-'a'] == 0) return 0;
    return (cmlpc(node->fii[s[0]-'a'],s+1) + 1);
}



int main(){

    ifstream in("trie.in");
    ofstream out("trie.out");
    int tip;
    char w[25];

    while(in>>tip>>w){
    if(tip==0)
        adauga_nod(trie,w);
    if(tip==1)
        sterge_nod(trie,w);
    if(tip==2)
        out<<aparitii_nod(trie,w)<<'\n';
    if(tip==3)
        out<<cmlpc(trie,w)<<'\n';
    }


    in.close();
    out.close();
    return 0;
}