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 }