Cod sursa(job #946108)

Utilizator assa98Andrei Stanciu assa98 Data 3 mai 2013 20:16:04
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <cstdio>
#include <cstring>
using namespace std;

struct Trie
{
    int count;
    int nrfii;
    Trie *f[28];

    Trie()
    {
        count=0;
        nrfii=0;
        memset(f,0,sizeof(f));
    }
} *R=new Trie;

void insert(const char sir[30],int i,Trie *T)
{
    if(sir[i]==0)
    {
        T->count++;
        return;
    }
    if(T->f[sir[i]-'a']==NULL)
    {
        T->f[sir[i]-'a']=new Trie;
        T->nrfii++;
    }
    insert(sir,i+1,T->f[sir[i]-'a']);
}

int remove(const char sir[30],int i,Trie *T)
{
    if(sir[i]==0)
    {
        T->count--;
        if(T->count==0)
        {
            delete T;
            return 1;
        }
        return 0;
    }
    if(remove(sir,i+1,T->f[sir[i]-'a']))
    {
        T->f[sir[i]-'a']=0;
        T->nrfii--;
    }
    if(T->nrfii==0&&T->count==0&&T!=R)
    {
        delete T;
        return 1;
    }
    return 0;
}

int nr(const char sir[30],int i,Trie *T)
{
    if(sir[i]==0)
        return T->count;
    if(T->f[sir[i]-'a']==NULL)
        return 0;
    return nr(sir,i+1,T->f[sir[i]-'a']);
}

int pref(const char sir[30],int i,Trie *T)
{
    if(sir[i]==0)
        return i;
    if(T->f[sir[i]-'a']==NULL)
        return i;
    return pref(sir,i+1,T->f[sir[i]-'a']);
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int o;
    char w[30];
    while(scanf("%d %s",&o,&w)!=EOF)
    {
        if(o==0)
            insert(w,0,R);
        else if(o==1)
            remove(w,0,R);
        else if(o==2)
            printf("%d\n",nr(w,0,R));
        else
            printf("%d\n",pref(w,0,R));
    }
    return 0;
}