Cod sursa(job #2539127)

Utilizator denmirceaBrasoveanu Mircea denmircea Data 5 februarie 2020 17:52:33
Problema Trie Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.83 kb
#include <bits/stdc++.h>
using namespace std;
ifstream fin("trie.in");
ofstream fout("trie.out");
int t,ok;
char s[30];
struct trie
{
    int nrfii,inf;
    trie *f[26];
    trie()
    {
        inf=nrfii=0;
        for(int i=0; i<26; i++)
            f[i]=0;
    }
};
void adun(trie *r,char *s)
{
    if(*s)
    {
        if(!r->f[*s-'a'])
        {
            r->f[*s-'a']=new trie;
            r->nrfii++;
        }
        if(*(s+1)==0)
        {
            r->f[*s-'a']->inf++;
        }
        else
        adun(r->f[*s-'a'],s+1);
    }
}
void sterg(trie *r,char *s)
{
    if(*s)
    {
        sterg(r->f[*s-'a'],s+1);

        if(r->f[*s-'a']->nrfii!=0 || r->f[*s-'a']->inf!=0)
            ok=0;
        if(ok==1){
            r->nrfii--;
            delete r->f[*s-'a'];
            r->f[*s-'a']=0;
        }
    }
    else{
         r->inf--;
            if( r->inf==0&& r->nrfii==0)
            {
                ok=1;
            }
    }
}
int nrap(trie *r,char *s)
{
    if(*s)
    {
         if(!r->f[*s-'a'])
            return 0;
        return nrap(r->f[*s-'a'],s+1);
    }else{
        return r->inf;
    }
}
int prefix(trie *r,char *s){
    if(*s)
    {
        if(r->f[*s-'a']==0)
            return 0;
        return 1+prefix(r->f[*s-'a'],s+1);
    }
    return 0;
}
int main()
{
    trie *rad = new trie;
    while(fin>>t>>s)
    {
        if(t==0)
        {
            // adun
            adun(rad,s);

        }
        else if(t==1)
        {
            ok=0;
            // sterg
            sterg(rad,s);
        }
        else if(t==2)
        {
            // nrap
            fout<<nrap(rad,s)<<"\n";
        }
        else
        {
            // lungime pref comun
            fout<<prefix(rad,s)<<"\n";
        }

    }


}