hdu 1247(字典树)

 1 /*
 2 *   字典树
 3 *   思路:把所有单词建成一棵字典树,然后把每个分成两部分,判断这两部分是否在树中
 4 *         是,就符合条件。
 5 */
 6 
 7 #include <cstdio>
 8 #include <cstdlib>
 9 #include <cstring>
10 #include <iostream>
11 
12 using namespace std;
13 
14 const int N = 16;
15 const int M = 50005;
16 
17 char strL[N], strR[N], dic[M][N]; 
18 struct node {
19     bool flag;
20     node *child[26];
21     node() {
22         flag = false;
23         for (int i=0; i<26; ++i) child[i] = NULL;
24     }
25 }*root;
26 
27 void insert(char str[]) {
28     node *p = root;
29     for (int k,i=0; str[i]; ++i, p=p->child[k]) {
30         k = str[i] - 'a';
31         if (!p->child[k]) p->child[k] = new node(); 
32     }
33     p->flag = true; //单词结尾 
34 }
35 
36 bool search(char str[]) {
37     node *p = root;
38     for (int k,i=0; str[i]; ++i) {
39         k = str[i] - 'a';
40         if (p->child[k]) p = p->child[k];
41         else return false;
42     }
43     return p->flag; //注意,可能表示单词的结尾,也可能不是 
44 }
45 
46 int main() {
47     int i, k, ni, nj, len;
48     root = new node();
49     for (i=-1; scanf("%s", dic[++i])!=EOF; insert(dic[i]));
50     for (int j=0; j<=i; ++j) {
51         len = strlen(dic[j]);
52         for (k=1; k<len; ++k) {//把单词分成两部分 
53             for (ni=0; ni<k; ++ni) strL[ni] = dic[j][ni];
54             for (nj=k; nj<len; ++nj) strR[nj-k] = dic[j][nj];
55             strL[ni] = strR[nj-k] = '\0';
56             if (search(strL) && search(strR)) {
57                 printf ("%s\n", dic[j]);
58                 break;
59             } 
60         }
61     }
62     return 0;
63 }

 

posted on 2012-05-08 07:03  Try86  阅读(738)  评论(0)    收藏  举报