Cod sursa(job #1335764)

Utilizator emiemiEmi Necula emiemi Data 5 februarie 2015 20:56:07
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.53 kb
#include<fstream>
#include<cstring>
using namespace std;
ifstream f("trie.in");
ofstream g("trie.out");
int op;
char s[22];
struct trie{
    int nr,nrf;
    trie *fii[26];
    trie()
    {
        nr=nrf=0;
        memset(fii,0,sizeof(fii));
    }
};
trie *t =new trie;
void insereaza(trie *x,char *p)
{
    if(*p==0)
    {
        ++x->nr;
        return ;
    }
    if(!(x->fii[*p-'a']))
    {
        ++x->nrf;
        x->fii[*p-'a']=new trie;
    }
    insereaza(x->fii[*p-'a'],p+1);
}
int sterge(trie *x,char *p)
{
    if(*p==0)
    {
        --x->nr;
    }
    else
    if(sterge(x->fii[*p-'a'],p+1))
    {
        --x->nrf;
        x->fii[*p-'a']=0;
    }
    if(x->nrf==0&&x->nr==0&&t!=x)
    {
        delete x;
        return 1;
    }
    return 0;
}
int egale(trie *x,char *p)
{
    if(*p==0)
    {
        return x->nr;
    }
    else
    if(x->fii[*p-'a'])
    {
        return egale(x->fii[*p-'a'],p+1);
    }
    return 0;
}
int prefix(trie *x,char *p,int l)
{
    if(*p==0||x->fii[*p-'a']==0)
    {
        return l;
    }
    return prefix(x->fii[*p-'a'],p+1,l+1);
}
int main()
{
    while(f>>op)
    {
        f>>s;
        if(op==0)
        {
            insereaza(t,s);
        }
        else
        if(op==1)
        {
            sterge(t,s);
        }
        else
        if(op==2)
        {
            g<<egale(t,s)<<'\n';
        }
        else
        if(op==3)
        {
            g<<prefix(t,s,0)<<'\n';
        }
    }
    return 0;
}