Cod sursa(job #1318175)

Utilizator goalexboxerFMI Alexandru Ionascu goalexboxer Data 15 ianuarie 2015 18:26:17
Problema Trie Scor 55
Compilator cpp Status done
Runda Arhiva educationala Marime 2.97 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;
    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();
            trie->children++;
            trie->links[(int)(*word) - ascii] = vertex;
            op0(vertex, word+1);

        }
    }
    else
    {
        trie->quantity++;
    }

}

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

    while(*word != '\n')
    {
        if(trie)
        {
           if(trie->links[(int)(*word) - ascii] != NULL)
           {

                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 != NULL)
    {
        if(trie->quantity > 1)
        {
            trie->quantity--;
        }
        else
        {
            if(del->links[pos] && del)
            {
                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++;
    }

    if(trie)
        return trie->quantity;
    else return 0;
}

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];
    myTrie->children = 1;


    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;

}