Cod sursa(job #1247676)

Utilizator usermeBogdan Cretu userme Data 23 octombrie 2014 11:59:05
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <cstdio>

using namespace std;

FILE*f=fopen("trie.in","r");
FILE*h=fopen("trie.out","w");

struct nod{
    nod *fii[26];
    int nrp,nrc;
    nod(){
        nrp=nrc=0;
        for ( int i=0;i<26;++i )
            fii[i]=NULL;
    }
};

nod *r;

nod *adauga(nod* p,char *s){
    if ( s[0]==0 )return NULL;
    if ( p==NULL )p=new nod;
    p->nrp++;
    if ( s[1]==0 )
        p->nrc++;
    p->fii[s[0]-'a']=adauga(p->fii[s[0]-'a'],s+1);
    return p;
};

void sterge(nod *p,char *s){
    if ( s[0]==0 )return;
    p->nrp--;
    if ( s[1]==0 )
        p->nrc--;
    sterge(p->fii[s[0]-'a'],s+1);
    if ( p->nrp==0 );
        delete p;
}

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

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

char c[21];

int t;

int main(){
    while ( fscanf(f,"%d %s\n",&t,&c)!=EOF ){
        if ( t==0 )
            r=adauga(r,c);
        if ( t==1 )
            sterge(r,c);
        if ( t==2 )
            fprintf(h,"%d\n",apar(r,c));
        if ( t==3 )
            fprintf(h,"%d\n",prefix(r,c));
    }
    return 0;
}