Cod sursa(job #3137075)

Utilizator alvaro.regueira-vilarAlvaro Regueira Vilar alvaro.regueira-vilar Data 11 iunie 2023 10:14:04
Problema Trie Scor 55
Compilator c-64 Status done
Runda Arhiva educationala Marime 3.33 kb
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define ALPHABET_SIZE 26

typedef struct TrieNode {
    struct TrieNode* children[ALPHABET_SIZE];
    int count; // Contador de apariciones de la palabra
} TrieNode;

// Función para crear un nuevo nodo del Trie
TrieNode* createNode() {
    TrieNode* node = (TrieNode*)malloc(sizeof(TrieNode));
    node->count = 0;
    for (int i = 0; i < ALPHABET_SIZE; i++) {
        node->children[i] = NULL;
    }
    return node;
}

// Función para insertar una palabra en el Trie
void insert(TrieNode* root, const char* word) {
    TrieNode* current = root;
    for (int i = 0; word[i] != '\0'; i++) {
        int index = word[i] - 'a';
        if (current->children[index] == NULL) {
            current->children[index] = createNode();
        }
        current = current->children[index];
    }
    current->count++;
}

// Función para eliminar una palabra del Trie
void removeWord(TrieNode* root, const char* word) {
    TrieNode* current = root;
    for (int i = 0; word[i] != '\0'; i++) {
        int index = word[i] - 'a';
        current = current->children[index];
    }
    current->count--;
}

// Función para buscar una palabra en el Trie y obtener su contador
int search(TrieNode* root, const char* word) {
    TrieNode* current = root;
    for (int i = 0; word[i] != '\0'; i++) {
        int index = word[i] - 'a';
        if (current->children[index] == NULL) {
            return 0;
        }
        current = current->children[index];
    }
    return current->count;
}

// Función para obtener la longitud del prefijo más largo de una palabra en el Trie
int getLongestPrefix(TrieNode* root, const char* word) {
    TrieNode* current = root;
    int length = 0;
    for (int i = 0; word[i] != '\0'; i++) {
        int index = word[i] - 'a';
        if (current->children[index] == NULL) {
            break;
        }
        current = current->children[index];
        length++;
    }
    return length;
}

int main() {
    TrieNode* root = createNode(); // Crear el nodo raíz del Trie

    FILE* inputFile = fopen("trie.in", "r"); // Abrir el archivo de entrada en modo lectura
    FILE* outputFile = fopen("trie.out", "w"); // Abrir el archivo de salida en modo escritura

    char line[30];
    while (fgets(line, sizeof(line), inputFile)) {
        int operation;
        char word[21];

        sscanf(line, "%d %s", &operation, word); // Leer la línea del archivo de entrada

        if (operation == 0) {
            // Operación 0: Agregar una aparición de la palabra en la lista
            insert(root, word);
        } else if (operation == 1) {
            // Operación 1: Eliminar una aparición de la palabra en la lista
            removeWord(root, word);
        } else if (operation == 2) {
            // Operación 2: Buscar y obtener el número de apariciones de una palabra
            int count = search(root, word);
            fprintf(outputFile, "%d\n", count);
        } else if (operation == 3) {
            // Operación 3: Obtener la longitud del prefijo más largo de una palabra en el Trie
            int prefixLength = getLongestPrefix(root, word);
            fprintf(outputFile, "%d\n", prefixLength);
        }
    }

    fclose(inputFile);
    fclose(outputFile);

    return 0;
}