Cod sursa(job #1960356)

Utilizator raduzxstefanescu radu raduzx Data 10 aprilie 2017 13:09:10
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>
#include <cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
struct trie
{
    int cnt,nrfii;
    trie *fiu[26];
    trie()
    {
        cnt=nrfii=0;
        memset(fiu,0,sizeof(fiu));
    }
};
typedef trie *ptrie;
ptrie rad=new trie;
void ins(ptrie nod,char *s)
{
    if( *s==0 ){
        nod->cnt+=1;return ;
    }
    if(nod->fiu[*s-'a']==0)
    {
        nod->fiu[*s-'a']=new trie;
        nod->nrfii+=1;
    }
    ins(nod->fiu[*s-'a'],s+1);
}
int del(ptrie nod,char *s)
{
    if(*s==0)
        nod->cnt--;
    else
        if(del(nod->fiu[*s-'a'],s+1))
        {
            nod->fiu[*s-'a' ] = 0;
            nod->nrfii--;

        }
    if(nod->cnt==0 and nod!=rad and nod->nrfii==0)
    {
        delete nod;return 1;
    }
    return 0;
}
int que(ptrie nod,char *s)
{
    if(*s==0)
        return nod->cnt;
    if(nod->fiu[*s-'a'])
        return que(nod->fiu[*s-'a'],s+1);
    return 0;
}
int pre(ptrie nod,char *s,int k)
{
    if(*s==0 or !nod->fiu[*s-'a'])
        return k;
    return pre(nod->fiu[*s-'a'],s+1,k+1);
}
int main()
{
    char s[30];
    int a;
    while(f>>a)
    {
        f>>s;
        if(a==0)
            ins(rad,s);
        else
            if(a==1)
                del(rad,s);
            else
                if(a==2)
                    g<<que(rad,s)<<'\n';
                else
                    g<<pre(rad,s,0)<<'\n' ;
    }
    return 0;
}