Cod sursa(job #652528)

Utilizator ariel_roAriel Chelsau ariel_ro Data 24 decembrie 2011 20:26:36
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.44 kb
#include <iostream>

using namespace std;

struct Trie
{
    int wAp, prefAp, noLeg;
    Trie *leg[26];

    Trie() {
        wAp = noLeg = prefAp = 0;
        for (int i = 0; i < 26; i++)
        {
            leg[i] = NULL;
        }
    }
};

Trie *root = new Trie;
FILE *f = fopen("trie.in", "r");
FILE *g = fopen("trie.out", "w");

void insert(char *s)
{
    Trie *currentNode = root;
    for (int i = 0; i < strlen(s); i++)
    {
        char lit = s[i] - 97;
        if (currentNode->leg[lit] == NULL)
        {
            currentNode->leg[lit] = new Trie;
            currentNode->noLeg++;
        }

        if (i == strlen(s) - 1)
        {
            currentNode->leg[lit]->wAp++;
        }
        currentNode->leg[lit]->prefAp++;
        currentNode = currentNode->leg[lit];
    }
}

void del(char *s)
{
    char lit = s[0] - 97;
    Trie *currentNode = root->leg[lit], *tempNode, *parentNode = root;
    for (int i = 0; i < strlen(s); i++)
    {
        if (currentNode->prefAp > 1)
        {
            currentNode->prefAp--;
            if (currentNode->wAp > 0)
            {
                currentNode->wAp--;
            }
        }
        else
        {
            parentNode->leg[lit] = NULL;
            delete currentNode;
        }

        if (i + 1 >= strlen(s))
            break;
        lit = s[i + 1] - 97;
        parentNode = currentNode;
        currentNode = currentNode->leg[lit];
    }
}

int apar(char *s)
{
    Trie *currentNode = root;
    for (int i = 0; i < strlen(s); i++)
    {
        char lit = s[i] - 97;
        currentNode = currentNode->leg[lit];
        if (currentNode == NULL)
        {
            break;
        }
    }

    return currentNode->wAp;
}

int pref(char *s)
{
    Trie *currentNode = root;
    int lung = 0;
    for (int i = 0; i < strlen(s); i++)
    {
        char lit = s[i] - 97;
        currentNode = currentNode->leg[lit];
        if (currentNode == NULL)
        {
            return lung;
        }

        lung++;
    }

    return lung;
}

int main()
{
    int op;
    char param[23];
    while (fscanf(f, "%d %s", &op, &param) != EOF)
    {
        switch (op)
        {
            case 0: insert(param); break;
            case 1: del(param); break;
            case 2: fprintf(g, "%d\n", apar(param)); break;
            case 3: fprintf(g, "%d\n", pref(param)); break;
        }
    }
}