Problem Address:http://poj.org/problem?id=2503
Trie树(即字典树)。
动态创建。
第一次写字典树,写得很快,连最后的DEBUG都不用,没想到居然一次AC。很是兴奋。
后来看了discuss发现比较多的人用了快排+二分,效果也不错。不过既然我字典树过了,那就……
在此还要摘抄一个输入方式,虽然我用的不是这种。
//判断某一行是否为空行,并以此作为上下文的分界线。
char buff[50] ; Word dict[100] ; int i = 0 ; while (gets (buff) && strcmp (buff, "") != 0) { sscanf (buff, "%s%s", dict[i].english, dict[i].foreign) ; i++ ; }
以下贴代码:
代码虽说有点长,但是结构还是挺清晰的。我为此也抽出了好几个函数,使得代码更加简洁。
字典树其实很好理解,这里就不多说了,百度一下就知道:http://baike.baidu.com/view/2759664.htm
#include <iostream> #include <cstring> using namespace std; struct node { char word[11]; node* next[26]; }; node *create_node() { node *temp; int i; temp = (node*)malloc(sizeof(node)); strcpy(temp->word, "eh"); for (i=0; i<26; i++) temp->next[i] = NULL; return temp; } void trie(node *root, char a[11], char b[11]) { int i; node *temp = root; for (i=0; b[i]!='/0'; i++) { if (temp->next[b[i]-'a']==NULL) { temp->next[b[i]-'a'] = create_node(); } temp = temp->next[b[i]-'a']; } strcpy(temp->word, a); } char *find_word(node *root, char a[11]) { node *temp = root; int i; for (i=0; a[i]!='/0'; i++) { if (temp->next[a[i]-'a']!=NULL) { temp = temp->next[a[i]-'a']; } else return "eh"; } return temp->word; } void destroy_trie(node *root) { if (root==NULL) return; int i; for (i=0; i<26; i++) { destroy_trie(root->next[i]); } free(root); } int main() { node *root = create_node(); char a[11],b[11],c; while(scanf("%c", &c)!=EOF) { if (c=='/n') break; a[0] = c; scanf("%s %s", &a[1], b); getchar(); trie(root,a,b); } while(scanf("%s", a)!=EOF) { printf("%s/n", find_word(root, a)); } destroy_trie(root); return 0; }
今天学习了并查集还是字典树,总算有点收获啊~~
照着大牛的切题顺序来切确实不错。虽然有些题看起来现在做好像有点早,但是就是觉得可以做出来,或者觉得一定可以学习得来。不知不觉就学习多了东西,很是受益。