Cod sursa(job #2081406)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 4 decembrie 2017 18:12:51
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.88 kb
#include <cstdio>

using namespace std;
char s[22];
struct trie {
    int fii,nr;
    trie *v[26];
    trie (){
        fii=nr=0;
        for (int i=0;i<26;i++)
            v[i]=0;
    }
};
trie *r=new trie;
trie *root=r;
void update (trie *&r,int i) {
    if (s[i]!=0){
        if (r->v[s[i]-'a']==NULL){
            r->fii++;
            r->v[s[i]-'a']=new trie;
        }
        update (r->v[s[i]-'a'],i+1);
    }
    else r->nr++;
}
int sterge (trie *&r,int i){
    if (i==2)
        printf ("a");
    if (s[i]==0){
        r->nr--;
        if (r->nr==0){ /// trb sa sterg ramura aia
            if (r->fii==0 && r!=root){
                delete r;
                r=0;
                return 1;
            }
        }
    }
    else {
        if (sterge (r->v[s[i]-'a'],i+1)){
            r->fii--;
            if (r->fii==0 && r->nr==0 && r!=root){
                delete r;
                r=0;
                return 1;
            }
        }
    }
    return 0;
}
int frecv (trie *r,int i){
    if (r==NULL)
        return 0;
    if (s[i]==0)
        return r->nr;
    else
        return frecv (r->v[s[i]-'a'],i+1);
}
int prcm (trie *r,int i){
    if (i==1)
        printf ("a");
    if (s[i]==0)
        return 0;
    if (r->v[s[i]-'a']==NULL)
        return 0;
    else return 1+prcm (r->v[s[i]-'a'],i+1);
}
int main()
{
    FILE *fin=fopen ("trie.in","r");
    FILE *fout=fopen ("trie.out","w");
    int
    c=fgetc (fin);
    while (c>='0' && c<='3'){
        fgetc (fin);
        fscanf (fin,"%s",s);
        fgetc (fin);
        if (c=='0')
            update (root,0);
        else if (c=='1')
            sterge (root,0);
        else if (c=='2')
            fprintf (fout,"%d\n",frecv (root,0));
        else if (c=='3')
            fprintf (fout,"%d\n",prcm (root,0));
        c=fgetc (fin);
    }
    return 0;
}