Cod sursa(job #2280558)

Utilizator ardutgamerAndrei Bancila ardutgamer Data 10 noiembrie 2018 20:30:40
Problema Trie Scor 90
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.58 kb
#include <cstdio>
#define ch (*s - 'a')

using namespace std;

struct Trie{
Trie *leg[26];
int nrfii,fr;
Trie()
{
    for(int i = 0 ; i < 26 ; i++)
        leg[i] = 0;
    fr = nrfii = 0;
}
};

Trie *rad = new Trie;
char s[30];

inline void Add(Trie *nod,char *s)
{
    if(*s == '\0')
    {
        nod->fr++;
        return;
    }
    if(nod->leg[ch] == 0)
    {
        nod->leg[ch] = new Trie;
        nod->nrfii++;
    }
    Add(nod->leg[ch],s+1);
}

inline int Search(Trie *nod,char *s)
{
    if(*s == '\0')
        return nod->fr;
    if(nod->leg[ch] == 0)
        return 0;
    return Search(nod->leg[ch],s+1);
}

inline int Lg(Trie *nod, char *s, int len)
{
    if(*s=='\0' || nod->leg[ch]==0) return len;
    return Lg(nod->leg[ch],s+1,len+1);
}

inline int Delete(Trie *nod, char *s)
{
    if(*s=='\0')
        nod->fr--;
    else
        if(Delete(nod->leg[ch],s+1))
        {
            nod->nrfii--;
            nod->leg[ch]=0;
        }
    if(nod->nrfii==0 && nod->fr==0 && nod!=rad)
    {
        delete nod;
        return true;
    }
    return false;
}

int main()
{
    freopen("trie.in","r",stdin);
    freopen("trie.out","w",stdout);
    int tip,ok;
    while(scanf("%d",&tip) != EOF)
    {
        scanf("%s\n",s);
        if(!tip)
            Add(rad,s);
        else
            if(tip==1)
                ok=Delete(rad,s);
            else
                if(tip==2)
                    printf("%d\n",Search(rad,s));
                else
                    printf("%d\n",Lg(rad,s,0));
    }
    return 0;
}