Problem Description
A hat’s word is a word in the dictionary that is the concatenation of exactly two other words in the dictionary.
You are to find all the hat’s words in a dictionary.
Input
Standard input consists of a number of lowercase words, one per line, in alphabetical order. There will be no more than 50,000 words.
Only one case.
Output
Your output should contain all the hat’s words, one per line, in alphabetical order.
Sample Input
a
ahat
hat
hatword
hziee
word
Sample Output
ahat
hatword
题解:
就是看单词是不是可以由其他两个单词合并起来。
建树。
然后将每个单词进行划分,看存不存在。
代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#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;
}