题意:给你很多的单词,输出那些可以由其它的两个单词拼接起来的单词。
解法:先把所有单词插入到一个字典树中,然后暴力拆分每个单词,判断两段是不是都是单词,例如:abc 可以拆成 ab c和 a bc 分别判断是不是单词 如果两个都是单词就输出
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
char s[50010][100];
struct Node{
Node *child[26];
int n;
Node(){//初始化
n=0;
memset(child,0,sizeof(child));
}
};
Node *root;
void insert(char *s){
Node *p=root,*t;
int i,len;
for(i=0;s[i];i++){
int id=s[i]-'a';
if(p->child[id]){
p=p->child[id];
}else{
t=new Node();
p->child[id]=t;
p=t;
}
}
p->n=1;//该结点是单词的尾
}
int search(char *s){
int i,j;
Node *p=root;
for(i=0;s[i];i++){
int id=s[i]-'a';
if(p->child[id]){
p=p->child[id];
}else return 0;
}
if(p->n==1) return 1;//找到最后,并且是单词的
else return 0;
}
int main(){
int i,j,k,t;
char str1[100],str2[100];
root=new Node();
k=0;
while(gets(s[k])){//没有结束条件多组输入字符串的输入,可以这样写
insert(s[k]);
k++;
}
for(i=0;i<k;i++){
int len=strlen(s[i]);
if(len>1){
for(j=1;j<len;j++){//拆成两部分
for(t=0;t<j;t++) str1[t]=s[i][t];
str1[t]='\0';
for(t=j;t<len;t++) str2[t-j]=s[i][t];
str2[t-j]='\0';
if(search(str1)&&search(str2)){
printf("%s\n",s[i]);
break;
}
}
}
}
return 0;
}