简单的模板套用。先把所有的字都加入到字典树里,然后一个个字分成两部分去搜,看是否符合条件。
#include <stdio.h>
#include <ctype.h>
#include <string.h>
#include <stdlib.h>
#include <limits.h>
#include <math.h>
#include <algorithm>
using namespace std;
const int MAX=26;
typedef struct TrieNode
{
int flag;
struct TrieNode *next[MAX];
} TrieNode;
TrieNode Memory[1000000];
int allocp = 0;
char s[50005][100];
TrieNode * createTrieNode()
{
TrieNode * tmp = &Memory[allocp++];
tmp->flag = 1;
for (int i = 0; i < MAX; i++)
tmp->next[i] = NULL;
return tmp;
}
void insertTrie(TrieNode * pRoot, char * str)
{
TrieNode * tmp = pRoot;
int i = 0, k;
while (str[i])
{
k = str[i] - 'a';
if (tmp->next[k])
{
}
else
{
tmp->next[k] = createTrieNode();
}
tmp = tmp->next[k];
i++;
}
tmp->flag=0;
}
int searchTrie(TrieNode * root, char * str)
{
if (root == NULL)
return 0;
TrieNode * tmp = root;
int i = 0, k;
while (str[i])
{
k = str[i] - 'a';
if (tmp->next[k])
{
if(str[i+1]=='\0'&&tmp->next[k]->flag==0)
return 1;
tmp = tmp->next[k];
}
else
return 0;
i++;
}
return 0;
}
int main(void)
{
TrieNode *Root = createTrieNode();
int i=0;
while(scanf("%s",s[i])!=EOF)
{
//printf("%s\n",s[i]);
insertTrie(Root,s[i]);
i++;
}
int j;
int k;
int length;
char t1[100],t2[100];
for(j=0;j<i;j++)
{
length=strlen(s[j]);
for(k=1;k<length;k++)
{
strcpy(t1,s[j]);
t1[k]='\0';
strcpy(t2,s[j]+k);
//printf("%s %s\n",t1,t2);
if(searchTrie(Root,t1)&&searchTrie(Root,t2))
{
printf("%s\n",s[j]);
break;
}
}
}
return 0;
}