Cod sursa(job #604615)

Utilizator a_h1926Heidelbacher Andrei a_h1926 Data 23 iulie 2011 18:02:53
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <iostream>
#include <string>

#define LMax 22

using namespace std;

struct Trie
{
    int NSons;
    int NWords;
    Trie *Son[26];
    Trie ()
    {
        NSons=0;
        NWords=0;
        memset (Son, NULL, sizeof (Son));
    }
};

Trie *T=new Trie;

inline int Code (char C)
{
    return ((int)C-(int)'a');
}

void Insert (Trie *Node, char *Letter)
{
    if (*Letter=='\n')
    {
        ++Node->NWords;
        return;
    }
    int C=Code (*Letter);
    if (Node->Son[C]==NULL)
    {
        ++Node->NSons;
        Node->Son[C]=new Trie;
    }
    Insert (Node->Son[C], Letter+1);
}

bool Delete (Trie *Node, char *Letter)
{
    if (*Letter=='\n')
    {
        --Node->NWords;
    }
    else
    {
        int C=Code (*Letter);
        if (Delete (Node->Son[C], Letter+1))
        {
            --Node->NSons;
            Node->Son[C]=NULL;
        }
    }
    if (Node->NSons==0 and Node->NWords==0 and Node!=T)
    {
        delete Node;
        return true;
    }
    return false;
}

int Query (Trie *Node, char *Letter)
{
    if (*Letter=='\n')
    {
        return Node->NWords;
    }
    int C=Code (*Letter);
    return Query (Node->Son[C], Letter+1);
}

int Prefix (Trie *Node, char *Letter, int L)
{
    int C=Code (*Letter);
    if (*Letter=='\n' or Node->Son[C]==NULL)
    {
        return L;
    }
    return Prefix (Node->Son[C], Letter+1, L+1);
}

int main()
{
    freopen ("trie.in", "r", stdin);
    freopen ("trie.out", "w", stdout);
    int Type;
    while (scanf ("%d", &Type)!=EOF)
    {
        char Word[LMax];
        memset (Word, '\0', sizeof (Word));
        scanf ("%s", &Word);
        strcat (Word, "\n");
        if (Type==0)
        {
            Insert (T, Word);
        }
        if (Type==1)
        {
            Delete (T, Word);
        }
        if (Type==2)
        {
            printf ("%d\n", Query (T, Word));
        }
        if (Type==3)
        {
            printf ("%d\n", Prefix (T, Word, 0));
        }
    }
    return 0;
}