Trie樹(動態規劃)
阿新 • • 發佈:2018-11-07
字首查詢的典型應用:
http://acm.hdu.edu.cn/showproblem.php?pid=1251
hohicoder1014是相同的模板題
#include<iostream> #include<cstring> using namespace std; typedef struct Trie_node { int count; // 統計單詞前綴出現的次數 struct Trie_node* next[26]; // 指向各個子樹的指標 bool exist; // 標記該結點處是否構成單詞 }TrieNode , *Trie; TrieNode* createTrieNode() { TrieNode* node = (TrieNode *)malloc(sizeof(TrieNode)); node->count = 0; node->exist = false; memset(node->next , 0 , sizeof(node->next)); // 初始化為空指標 return node; } void Trie_insert(Trie root, char* word) { Trie node = root; char *p = word; int id; while( *p ) { id = *p - 'a'; if(node->next[id] == NULL) { node->next[id] = createTrieNode(); } node = node->next[id]; // 每插入一步,相當於有一個新串經過,指標向下移動 ++p; node->count += 1; // 這行程式碼用於統計每個單詞前綴出現的次數(也包括統計每個單詞出現的次數) } node->exist = true; // 單詞結束的地方標記此處可以構成一個單詞 } int Trie_search(Trie root, char* word) { Trie node = root; char *p = word; int id; while( *p ) { id = *p - 'a'; node = node->next[id]; ++p; if(node == NULL) return 0; } return node->count; } int main(void) { Trie root = createTrieNode(); // 初始化字典樹的根節點 char str[12] ; bool flag = false; while(gets(str)) { if(flag) printf("%d\n",Trie_search(root , str)); else { if(strlen(str) != 0) { Trie_insert(root , str); } else flag = true; } } return 0; }
字典樹的查詢
http://acm.hdu.edu.cn/showproblem.php?pid=1075
#include<iostream> #include<cstring> using namespace std; typedef struct Trie_node { int count; // 統計單詞前綴出現的次數 struct Trie_node* next[26]; // 指向各個子樹的指標 bool exist; // 標記該結點處是否構成單詞 char trans[11]; // 翻譯 }TrieNode , *Trie; TrieNode* createTrieNode() { TrieNode* node = (TrieNode *)malloc(sizeof(TrieNode)); node->count = 0; node->exist = false; memset(node->next , 0 , sizeof(node->next)); // 初始化為空指標 return node; } void Trie_insert(Trie root, char* word , char* trans) { Trie node = root; char *p = word; int id; while( *p ) { id = *p - 'a'; if(node->next[id] == NULL) { node->next[id] = createTrieNode(); } node = node->next[id]; // 每插入一步,相當於有一個新串經過,指標向下移動 ++p; node->count += 1; // 這行程式碼用於統計每個單詞前綴出現的次數(也包括統計每個單詞出現的次數) } node->exist = true; // 單詞結束的地方標記此處可以構成一個單詞 strcpy(node->trans , trans); } char* Trie_search(Trie root, char* word) { Trie node = root; char *p = word; int id; while( *p ) { id = *p - 'a'; node = node->next[id]; ++p; if(node == NULL) return 0; } if(node->exist) // 查詢成功 return node->trans; else // 查詢失敗 return NULL; } int main(void) { Trie root = createTrieNode(); // 初始化字典樹的根節點 char str1[3003] , str2[3003] , str[3003] , *p; int i , k; scanf("%s",str1); while(scanf("%s",str1) && strcmp(str1 , "END") != 0) { scanf("%s",str2); Trie_insert(root , str2 , str1); } getchar(); gets(str1); k = 0; while(gets(str1)) { if(strcmp(str1 , "END") == 0) break; for(i = 0 ; str1[i] != '\0' ; ++i) { if(str1[i] >= 'a' && str1[i] <= 'z') { str[k++] = str1[i]; } else { str[k] = '\0'; p = Trie_search(root , str); if(p) printf("%s", p); else printf("%s", str); k = 0; printf("%c", str1[i]); } } printf("\n"); } return 0; }