1 利用每个单词的首字母与一个数字索引相对应的方式快速确定二分查找范围;
2 把每个单词分割成两个子串分别查找;
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<string> dict[26];
bool BinarySearch(string value)
{
int lo = 0;
int hi = (int) dict[value[0] - 97].size() - 1;
while(lo <= hi) {
int mid = lo + (hi-lo)/2;
if (dict[value[0] - 97][mid] < value) lo = mid+1;
else if(dict[value[0] - 97][mid] > value) hi = mid-1;
else return true;
}
return false;
}
int main()
{
string s;
while(cin >> s)
dict[s[0] - 97].push_back(s);
for(int i = 0; i < 26; i++) {
for(int j = 0; j < (int) dict[i].size(); j++) {
s = dict[i][j];
for(int k = 1; k <= (int) s.size()-1; k++) {
string s1 = s.substr(0,k);
string s2 = s.substr(k,(int) s.size()-k);
if(BinarySearch(s1) && BinarySearch(s2)) { cout << s << endl; break; }
}
}
}
return 0;
}
如有错误,请勿吝惜指正。