Cod sursa(job #1660838)

Utilizator GinguIonutGinguIonut GinguIonut Data 23 martie 2016 14:38:01
Problema Trie Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <cstdio>
#include <string.h>

#define CH (*s-'a')

using namespace std;

struct Trie
{
    int cnt, nrfii;
    Trie *fiu[26];
    Trie()
    {
        cnt=nrfii=0;
        memset(fiu, 0, sizeof(fiu));
    }
};
Trie *T=new Trie;
void ins(Trie *node, char *s)
{
    if(*s=='\n')
    {
        node->cnt++;
        return;
    }

    if(node->fiu[CH]==0)
    {
        node->fiu[CH]=new Trie;
        node->nrfii++;
    }

    ins(node->fiu[CH], s+1);
}
inline bool del(Trie *node, char *s)
{
    if(*s=='\n')
        node->cnt--;
    else
    {
        if(del(node->fiu[CH], s+1))
        {
            node->nrfii--;
            node->fiu[CH]=0;
        }
    }

    if(node->nrfii==0 && node->cnt==0 && node!=T)
    {
        delete node;
        return 1;
    }

    return 0;
}
int que(Trie *node, char *s)
{
    if(*s=='\n')
        return node->cnt;

    if(node->fiu[CH])
        return que(node->fiu[CH], s+1);

    return 0;
}
int pre(Trie *node, char *s, int k)
{
    if(*s=='\n' || node->fiu[CH]==0)
        return k;

    return pre(node->fiu[CH], s+1, k+1);
}
int main()
{
    char line[32];
    freopen("trie.in", "r", stdin);
    freopen("trie.out", "w", stdout);
    fgets(line, 32, stdin);
    while(!feof(stdin))
    {
        switch(line[0])
        {
            case '0':ins(T, line+2);break;
            case '1':del(T, line+2);break;
            case '2':printf("%d\n", que(T, line+2));break;
            case '3':printf("%d\n", pre(T, line+2, 0));break;
        }
        fgets(line, 32, stdin);
    }
    return 0;
}