#include #include #define WORD_LEN 255 #define ALPHABET_SIZE 26 struct trie_node { struct trie_node *next[ALPHABET_SIZE]; int count; }; typedef struct trie_node TRIE_NODE; struct dict_desc { char name[WORD_LEN]; int size; }; typedef struct dict_desc DICT_DESC; void trie_add(TRIE_NODE *root, const char *word) { TRIE_NODE *cur_root = root; while (*word) { if (!cur_root->next[*word-'a']) { cur_root->next[*word-'a'] = malloc(sizeof(TRIE_NODE)); for (int i=0; inext[*word-'a']->next[i] = NULL; cur_root->next[*word-'a']->count = 0; } cur_root = cur_root->next[*word-'a']; ++word; } //Není potřeba si pamatovat konce slov, v zavěrečném počítání se hodnoty //v nekoncových uzlech zanedbají } void trie_increase_word_count(TRIE_NODE *root, const char *word) { TRIE_NODE *cur_root = root; //poslední fáze, máme jistotu že slovo najdeme while (*word && cur_root) { cur_root = cur_root->next[*word-'a']; ++word; } if (cur_root) cur_root->count++; } int trie_find(TRIE_NODE *root, const char *word) //nalezne slovo v trii a vrátí, kolikrát se vyskytlo { TRIE_NODE *cur_root = root; //poslední fáze, máme jistotu že slovo najdeme while (*word) { cur_root = cur_root->next[*word-'a']; ++word; } return cur_root->count; } void trie_free(TRIE_NODE *root) //uvolnění struktur { if (!root) return; for(int i=0; inext[i]); free(root); } TRIE_NODE *trie_root; int N; int main(void) { trie_root = malloc(sizeof(TRIE_NODE)); for (int i=0; inext[i] = NULL; trie_root->count = 0; //inicializace trie FILE *fdict = fopen("slovniky.in", "r"); int dict_count; fscanf(fdict, "%d", &dict_count); for (int dict=0; dictmax) max = dict_desc[dict].size; //vypsání slovníků FILE *fout = fopen("jazyk.out", "w"); for (int dict=0; dict