题目地址:http://vjudge.net/problem/UVA-10391
一开始是想枚举任意两个单词
/*
for i 1 n
for j i+1 n
if find(str[i]+str[j])!=NULL then save
O(n*n*logn)
*/
但复杂度太高,
然而单词长度是很小的,所以不如直接拆分单词,找组成这两个单词的单词是否存在
#include <bits/stdc++.h>
using namespace std;
#define REP(i,a,b) for(int i=a;i<=(int)(b);++i)
#define REPD(i,a,b) for(int i=a;i>=(int)(b);--i)
const int maxn=120000+5;
string str[maxn];
int n=0;
bool Search(string x){
int L=0,R=n-1;
while(L<=R){
int mid=(L+R)>>1;
if(str[mid]==x) return true;
else if(str[mid]<x) L=mid+1;
else R=mid-1;
}
return false;
}
int main(int argc, char const *argv[])
{
string temp;
while(cin>>temp) str[n++]=temp;
REP(i,0,n-1) REP(j,1,str[i].length()-1)
if(Search(str[i].substr(0,j))&&Search(str[i].substr(j))) {cout<<str[i]<<endl;break;}
return 0;
}