Cod sursa(job #1581654)

Utilizator zertixMaradin Octavian zertix Data 26 ianuarie 2016 23:29:28
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.54 kb
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;

struct trie{

    int nrcuv,nrfii;
    trie *fiu[26];
    trie()
    {
    nrcuv=0;
    nrfii=0;
    memset(fiu,0,sizeof(fiu));
    }
};

trie *t=new trie;

void ins(trie *nod, char *s)
{
    if (*s=='\n')
    {
        nod->nrcuv++;
        return;
    }
    if (nod->fiu[*s-'a']==0)
    {
        nod->fiu[*s-'a']=new trie;
        nod->nrfii++;
    }
    ins(nod->fiu[*s-'a'],s+1);
}

int del(trie *nod , char *s)
{
    if (*s=='\n')
        nod->nrcuv--;

    else if (del(nod->fiu[*s-'a'],s+1))
    {
        nod->fiu[*s-'a']=0;
        nod->nrfii--;
    }
    if (nod->nrcuv==0 && nod->nrfii==0 && nod !=t)
    {
        delete nod;
        return 1;
    }
    return 0;
}
int num(trie *nod,char *s)
{
    if (*s=='\n')
        return nod->nrcuv;
    if (nod->fiu[*s-'a'])
        num(nod->fiu[*s-'a'],s+1);
    else
        return 0;
}
int que(trie *nod,char *s,int k)
{
    if (nod->fiu[*s-'a']==0 || *s=='\n')
        return k;
    que(nod->fiu[*s-'a'],s+1,k+1);
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    char l[32];
    fgets(l,32 ,stdin);

    while (!feof(stdin) )
    {
        if (l[0]=='0')
            ins(t,l+2);
        if (l[0]=='1')
            del(t,l+2);
        if (l[0]=='2')
            printf("%d\n",num(t,l+2));
        if (l[0]=='3')
            printf("%d\n",que(t,l+2,0));
        fgets(l,32 ,stdin);

    }


    return 0;
}