题意:给定一序列的单词按照字典序输入,要求某些单词是由这其中的其它两个单词拼接而成的单词按照字典序输出
思路:把输入的单词建立成一棵字典树,然后顺序枚举这n个单词并判断即可
代码:
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 50010;
const int N = 150;
const int M = 26;
struct Node{
int mark;
Node* child[M];
};
Node node[MAXN*N];
Node* root;
int pos , numWord;
char word[MAXN][N];
Node* newNode(){
node[pos].mark = 0;
for(int i = 0 ; i < M ; i++)
node[pos].child[i] = NULL;
return &node[pos++];
}
void insert(char *str){
Node* s = root;
int len = strlen(str);
for(int i = 0 ; i < len ; i++){
int num = str[i]-'a';
if(s->child[num] == NULL)
s->child[num] = newNode();
s = s->child[num];
}
s->mark = 1;
}
bool search(char *str){
Node* s = root;
int len = strlen(str);
for(int i = 0 ; i < len ; i++){
int num = str[i]-'a';
if(s->child[num] == NULL)
return false;
s = s->child[num];
}
return s->mark == 1;
}
void solve(){
for(int i = 0 ; i < numWord ; i++){
int len = strlen(word[i]);
for(int j = 1 ; j < len ; j++){
char tmp[MAXN];
strcpy(tmp , word[i]);
tmp[j] = '\0';
if(search(tmp) && search(word[i]+j)){
printf("%s\n" , word[i]);
break;
}
}
}
}
int main(){
numWord = 0;
pos = 0;
root = newNode();
while(scanf("%s", word[numWord]) != EOF)
insert(word[numWord++]);
solve();
return 0;
}