Cod sursa(job #1317079)

Utilizator goalexboxerFMI Alexandru Ionascu goalexboxer Data 14 ianuarie 2015 15:33:36
Problema Trie Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.84 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)
        {
            trie->links[(int)(*word)-ascii]->children++;
            op0(trie->links[(int)(*word)-ascii], word+1);
        }
        else
        {
            Trie* vertex = new Trie();
            vertex->value = *word;
            trie->links[(int)(*word) - ascii] = vertex;

            op0(vertex, word+1);
        }
    }
    else
    {
        trie->quantity++;
    }

}

inline void op1(Trie* trie, char* word)
{
    while(*word != '\n')
    {
        if(trie->links[(int)(*word)- ascii] != NULL && *(word+1) == '\n')
        {
            if(trie->links[(int)(*word)- ascii]->quantity > 1)
            {
                trie->links[(int)(*word)- ascii]->quantity--;
                return;
            }
            else
            {
                 delete trie->links[(int)(*word)- ascii];
                 trie->links[(int)(*word)- ascii] = NULL;
                 return;

            }
        }
        if(trie->links[(int)(*word)- ascii] == NULL )
        {
            return;
        }
        else
        {
            trie = trie->links[(int)(*word)- ascii];
        }

        word++;
    }
}

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;

}