题意:
给你一些单词,问你其中哪一个单词可以由其他两个单词组成,还有就是一个单词可以由同一个单词重复组成两次。
题解:
把一个单词拆分成两个进去find函数查找,如果两个都可以说明该单词由两个单词组成。
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
const int MAXN=50000+7;
struct node
{
int cnt;
node *next[26];
node(){
cnt=0;
for(int i=0;i<26;i++)
next[i]=0;
}
}*root;
char s[MAXN][107];
void insert(char *s)
{
node *r=root;
for(int i=0;s[i];i++)
{
int x=s[i]-'a';
if(r->next[x]==0) r->next[x]=new(node);
r=r->next[x];
}
r->cnt=1;
}
bool find2(char *s)
{
node *r=root;
int len=strlen(s);
for(int i=0;s[i];i++)
{
int x=s[i]-'a';
r=r->next[x];
if(r==0)
return false;
}
if(r->cnt)
return true;
else
return false;
}
bool find(char *s)
{
node *r=root;
for(int i=0;s[i];i++)
{
int x=s[i]-'a';
r=r->next[x];
if(r==0)
return false;
if(r->cnt&&find2(s+i+1))
return true;
}
return false;
}
int main()
{
root=new(node);
int k=0;
while(~scanf("%s",s[k]))
{
// if(s[k][0]=='#')
// break;
insert(s[k]);
k++;
}
for(int i=0;i<k;i++)
{
if(find(s[i]))
printf("%s\n",s[i]);
}
}