Cod sursa(job #1318138)

Utilizator goalexboxerFMI Alexandru Ionascu goalexboxer Data 15 ianuarie 2015 17:50:21
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 3.02 kb
#include<stdio.h>
#define ascii (int)'a'
#define FIN "trie.in"
#define FOUT "trie.out"
using namespace std;

typedef struct Trie
{
    int children = 0;
    int quantity = 0;
    char value;
    Trie* links[26];
} Trie;

Trie* myTrie = new Trie();

inline void op0(Trie* trie, char* word)
{
    if(*word != '\n')
    {
        if(trie->links[(int)(*word)-ascii] != NULL)
        {
            op0(trie->links[(int)(*word)-ascii], word+1);
        }
        else
        {
            Trie* vertex = new Trie();
            vertex->value = *word;
            trie->children++;
            trie->links[(int)(*word) - ascii] = vertex;
            op0(vertex, word+1);
        }
    }
    else
    {
        trie->quantity++;
    }

}

inline void helperDelete(Trie* trie, char* word)
{
    while(*word != '\n')
    {
        if(trie->links[(int)(*word) - ascii]->children == 0)
        {
            delete trie->links[(int)(*word) - ascii];
            trie->links[(int)(*word) - ascii] = NULL;
            trie->children--;
        }

        trie = trie->links[(int)(*word) - ascii];
        word++;
    }
}

inline void op1(Trie* trie, char* word)
{
    Trie* del = new Trie();
    int pos = 0;

    while(*word != '\n')
    {
        if(trie->links[(int)(*word) - ascii]->children > 1)
        {
            del = trie->links[(int)(*word) - ascii];
            pos = (int)(*(word+1))-ascii;
        }

        trie = trie->links[(int)(*word) - ascii];
        word++;
    }


    if(trie->quantity > 1)
    {
        trie->quantity--;
    }
    else
    {
        delete (del->links[pos]);
        del->links[pos] = NULL;
        del->children--;
    }

}



inline int op2(Trie* trie, char* word)
{
    while(*word != '\n')
    {
        if(trie->links[(int)(*word)- ascii] == NULL)
        {
            return 0;
        }
        else
        {
            trie = trie->links[(int)(*word)- ascii];
        }

        word++;
    }

    return trie->quantity;
}

inline int op3(Trie* trie, char* word)
{

    int count = 0;
    while(*word != '\n')
    {
        if(trie->links[(int)(*word)- ascii] == NULL)
        {
            return count;
        }
        else
        {
            trie = trie->links[(int)(*word)- ascii];
        }

        count++;
        word++;
    }

    return count;
}

int main()
{
    char line[32];



    freopen(FIN, "r", stdin);
    freopen(FOUT, "w", stdout);

    fgets(line, 32, stdin);

    while( !feof(stdin))
    {
        switch(line[0])
        {
            case '0':
                op0(myTrie, line+2);
                break;
            case '1':
                op1(myTrie, line+2);
                break;
            case '2':
                printf("%d \n",op2(myTrie, line+2));
                break;
            case '3':
                printf("%d \n", op3(myTrie,line+2));
                break;
        }

        fgets(line, 32, stdin);
    }

    return 0;

}