Cod sursa(job #1644030)

Utilizator zertixMaradin Octavian zertix Data 9 martie 2016 21:16:05
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <bits/stdc++.h>

using namespace std;

int op;

struct trie
{
    int nrcuv,nrfii;
    trie *fii[26];
    trie()
    {
        nrcuv=0;
        nrfii=0;
        memset(fii,0,sizeof(trie));
    }
};
trie *root=new trie;
void adaug(char *p,trie *nod)
{
    if (*p=='\n')
        {
            nod->nrcuv++;
            return;
        }
    if (!nod->fii[*p-'a'])
            nod->fii[*p-'a']=new trie;
    nod->nrfii++;
    adaug(p+1,nod->fii[*p-'a']);
}
int sterge(char *p,trie *nod)
{
    if (*p=='\n')
        nod->nrcuv--;
    else if (sterge(p+1,nod->fii[*p-'a']))
    {
        nod->fii[*p-'a']=0;
        nod->nrfii--;
    }

    if (nod->nrcuv==0 && nod->nrfii==0 && nod!=root)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int numara(char *p,trie *nod)
{
    if (*p=='\n')
        return nod->nrcuv;
    if (!nod->fii[*p-'a'])
        return 0;
    numara(p+1,nod->fii[*p-'a']);
}
int prefix(char *p,trie *nod,int k)
{
    if (*p=='\n')
        return k;
    if (!nod->fii[*p-'a'])
        return k;
    prefix(p+1,nod->fii[*p-'a'],k+1);
}
int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    char s[32];

    while (!feof(stdin))
    {
        scanf("%d ",&op);
        fgets(s,32,stdin);
        scanf("\n");
        if (op==0)
            adaug(s,root);
        else if (op==1)
            sterge(s,root);
        else if (op==2)
            printf("%d\n",numara(s,root));
            else
                printf("%d\n",prefix(s,root,0));
    }
    return 0;
}