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 }

 

你可能感兴趣的:(HDU)