POJ2503 Babelfish Trie树

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; }

 

今天学习了并查集还是字典树,总算有点收获啊~~

 

照着大牛的切题顺序来切确实不错。虽然有些题看起来现在做好像有点早,但是就是觉得可以做出来,或者觉得一定可以学习得来。不知不觉就学习多了东西,很是受益。

 

你可能感兴趣的:(c,百度,null)