Cod sursa(job #903563)

Utilizator andrettiAndretti Naiden andretti Data 1 martie 2013 22:22:32
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include<stdio.h>
#include<string.h>
using namespace std;

struct trie
{
    int nr,nrf;
    trie *f[28];
    trie()
    {
        nr=nrf=0;
        memset(f,0,sizeof(f));
    }
};

trie *r;
int n,k;
char v[25];

void add()
{
    trie *q;
    int i,aux;

    q=r;
    for(i=1;i<=n;i++)
    {
        aux=v[i]-'a'+1;
        if(q->f[aux]==0)
        {
            q->f[aux]=new trie();
            q->nrf++;
        }
        q=q->f[aux];
    }
    q->nr++;
}

void del(trie *q,int k)
{
    int aux=v[k+1]-'a'+1;

    if(k==n) {q->nr--; return;}

    del(q->f[aux],k+1);
    if(q->f[aux]->nrf==0 && q->f[aux]->nr==0)
    {
        delete q->f[aux];
        q->f[aux]=0;
        q->nrf--;
    }
}

int count()
{
    int i,aux;
    trie *q;

    q=r;
    for(i=1;i<=n;i++)
    {
        aux=v[i]-'a'+1;
        if(q->f[aux]==0) return 0;
        q=q->f[aux];
    }
    return q->nr;
}

int pref()
{
    int i,aux,nrp=0;
    trie *q;

    q=r;
    for(i=1;i<=n;i++)
    {
        aux=v[i]-'a'+1;
        if(q->f[aux]==0) return nrp;
        nrp++;
        q=q->f[aux];
    }
    return n;
}

void cit()
{
    int ok;

    while(!feof(stdin))
    {
        scanf("%d %s",&ok,v+1);
        n=strlen(v+1);

        if(feof(stdin)) return;

        if(ok==0) add();
        else
         if(ok==1) del(r,0);
         else
            if(ok==2) printf("%d\n",count());
            else
                if(ok==3) printf("%d\n",pref());
    }
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);

    r=new trie();
    cit();
    fclose(stdin);
    fclose(stdout);
    return 0;

}