Cod sursa(job #652566)

Utilizator ariel_roAriel Chelsau ariel_ro Data 24 decembrie 2011 23:48:29
Problema Trie Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.69 kb
#include <stdio.h>
#include <iostream.h>
#include <stdlib.h>
#include <string.h>

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;
Trie *deleted[25];
FILE *f = fopen("grader_test1.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;
    int k = 0;
    Trie *currentNode = root->leg[lit], *tempNode, *parentNode = root;
    for (int i = 0; i < strlen(s); i++)
    {
        tempNode = currentNode;
        if (currentNode->prefAp > 1)
        {
            currentNode->prefAp--;
        }
        else
        {
            parentNode->leg[lit] = NULL;
            deleted[k] =  currentNode;
            k++;
        }

        if (currentNode->wAp > 0 && i == strlen(s) - 1)
        {
            currentNode->wAp--;
        }

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

    for (int i = 0; i < k; i++)
    {
        delete deleted[i];
    }
}

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)
        {
            return 0;
        }
    }

    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;
        }
    }
}