Trie树 + 暴力。
代码如下:
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 6 using namespace std; 7 8 char s[50002][100]; 9 10 typedef struct node 11 { 12 int flag; 13 node *next[26]; 14 }node; 15 16 node *newnode() //新节点 17 { 18 int i; 19 node *p=new node; 20 p->flag=0; 21 for (i=0; i<26; i++) 22 p->next[i]=NULL; 23 return p; 24 } 25 26 void insert(node *rt,char *str) //插入新节点 27 { 28 int i; 29 node *p=rt; 30 int t, len=strlen(str); 31 for (i=0; i<len; i++) 32 { 33 t=str[i]-'a'; 34 if (p->next[t] == NULL) 35 p->next[t]=newnode(); 36 p=p->next[t]; 37 } 38 p->flag=1; 39 } 40 41 int search(node *rt, char s[]) //查找 42 { 43 node *p=rt; 44 int i, t, len=strlen(s); 45 for (i=0; i<len; i++) 46 { 47 t=s[i]-'a'; 48 if (p->next[t] == NULL) 49 return 0; 50 p=p->next[t]; 51 } 52 if (p->flag == 1) 53 return 1; 54 return 0; 55 } 56 57 void del(node *p) //删除trie树 58 { 59 int i; 60 if (p) 61 for (i=0; i<26; i++) 62 if (p->next[i]) 63 del(p->next[i]); 64 free(p); 65 p=NULL; 66 } 67 68 int main() 69 { 70 int t1, t2; 71 int i, j, n, m, k; 72 node *rt, *p; 73 char ss[100], se[100]; 74 rt=newnode(); 75 i=0; 76 while(scanf("%s%*c", s[i]) != EOF) 77 { 78 insert(rt, s[i]); 79 i++; 80 } 81 n=i; 82 for (i=0; i<n; i++) 83 { 84 t1=t2=0; 85 m=strlen(s[i]); 86 if (m > 1) 87 { 88 for (j=1; j<m; j++) //拆成两部分 89 { 90 for (k=0; k<j; k++) 91 ss[k]=s[i][k]; 92 ss[k]='\0'; 93 for (; k<m; k++) 94 se[k-j]=s[i][k]; 95 se[k-j]='\0'; 96 t1=search(rt, ss); 97 t2=search(rt, se); 98 if (t1 == 1 && t2 == 1) 99 { 100 printf("%s\n", s[i]); 101 break; 102 } 103 } 104 } 105 } 106 del(rt); 107 return 0; 108 }