Pagini recente » Cod sursa (job #881085) | Cod sursa (job #2107026) | Cod sursa (job #2444495) | Cod sursa (job #1689345) | Cod sursa (job #3137075)
#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;
}