HDU 1247 Hat’s Words Trie題解,hdutrie
使用Trie的insert函數,主要是要靈活修改search函數,使得其可以快速搜尋hat word。
思路:
1 先搜尋一個word的首碼有沒有在Trie樹中找到,如果找到,儲存這個Node,方便下面繼續搜尋, 就搜尋餘下的能不能是Trie樹上的一個單詞,如果找到,那麼就是hat word了。
2 如果沒找到,那麼就沿著剛剛搜尋到的首碼單詞的節點繼續往下搜,這樣就可以加速程式,不用每次重複搜尋。
3 如果沿著Trie樹已經走到word的葉子節點了,那麼就結束這個word的搜尋了。
實現好這些思路,那麼速度是很快的。
#include <stdio.h>#include <string.h>const int MAX_N = 50001;const int ARR_SZIE = 26;char dict[MAX_N][100];//char dict[MAX_N][15]也AC,10就REint N;struct Node{int n;Node *arr[ARR_SZIE];Node():n(0){for (int i = 0; i < ARR_SZIE; i++){arr[i] = NULL;}}};void delTrie(Node *trie){if (trie){for (int i = 0; i < ARR_SZIE; i++){if (trie->arr[i]) delete trie->arr[i];}delete trie;}}Node *Trie;void insert(char *ch){Node *pCrawl = Trie;int len = strlen(ch);for (int i = 0; i < len; i++){int index = ch[i]-'a';if (!pCrawl->arr[index]) pCrawl->arr[index] = new Node;pCrawl = pCrawl->arr[index];}pCrawl->n++;}int pathLen;Node *searchHat(Node *rt, char *chs, int len){Node *pCrawl = rt;for (int i = 0; i < len; i++){int index = chs[i] - 'a';if (!pCrawl->arr[index]) return NULL;pCrawl = pCrawl->arr[index];pathLen++;if (pCrawl->n) return pCrawl;}if (pCrawl->n) return pCrawl;return NULL;}bool search(Node *rt, char *chs, int len){Node *pCrawl = rt;for (int i = 0; i < len; i++){int index = chs[i] - 'a';if (!pCrawl->arr[index]) return false;pCrawl = pCrawl->arr[index];}return pCrawl->n > 0;}int main(){Trie = new Node;N = 0;while (gets(dict[N])) insert(dict[N++]);for (int i = 0; i < N; i++){int len = strlen(dict[i]);pathLen = 0;Node *node = Trie;while (pathLen < len){node = searchHat(node, dict[i]+pathLen, len-pathLen);if (pathLen < len && node){if (search(Trie, dict[i]+pathLen, len-pathLen)){puts(dict[i]);break;}}}}delTrie(Trie);return 0;}
hdu1251是Trie樹,範例過了,但提交老是wrong answer,幫我看下下面的程式吧
nbnb