题目链接:hdu1247
/*
大意:
如果两个单词组成的单词存在,则输出组合后的单词
思路:字典树
在查找时,将一个单词分成两部分,看这两部分是否存在
*/
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdlib>
using namespace std;
struct node
{
bool flag;
node *next[26];
}*root;
node *build()
{
node *p = (node *)malloc(sizeof(node));
for(int i = 0; i < 26; i ++)
p -> next[i] = NULL;
p -> flag = false;
return p;
}
void save(char *s)
{
node *p;
p = root;
int len = strlen(s);
for(int i = 0; i < len; i ++)
{
if(p -> next[s[i] - 'a'] == NULL)
p -> next[s[i] - 'a'] = build();
p = p -> next[s[i] - 'a'];
}
p -> flag = true;
}
int query(char *s)
{
node *p;
p = root;
int len = strlen(s);
for(int i = 0; i < len; i ++)
{
if(p -> next[s[i]- 'a'] == NULL)
return 0;
p = p -> next[s[i] - 'a'];
}
if(p -> flag) return 1;
else return 0;
}
int main()
{
root = build();
char str[50005][20];
int n = 0;
while(~scanf("%s",str[n]))
{
save(str[n]);
n ++;
}
for(int i = 0; i < n; i ++)
{
char a[20],b[20];
int len = strlen(str[i]);
for(int j = 0; j < len; j ++)
{
memset(a, '\0', sizeof(a));
memset(b, '\0', sizeof(b));
strncpy(a, str[i], j);//单词前半部
strncpy(b, str[i] + j, len - j);//单词后半部
if(query(a) && query(b))
{
printf("%s\n",str[i]);
break;
}
}
}
return 0;
}