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 }