UVa10391
给定一个字典,判断字典中哪些单词可以拆分为字典中另外两个单词。
如果采用二重循环,则复杂度为O(n^2logl)
,其中n
为单词数量,l
为单词长度。如果依次拆分每个单词,则复杂度为O(n(logl)^2)
。由于输入的单词量最高达到120000
,因此第二种方法的耗时更少一些。
#include <iostream>
#include <set>
#include <string>
using namespace std;
int main()
{
set<string> dict;
string word;
while (cin >> word) {
dict.insert(word);
}
for (auto iter = dict.begin(); iter != dict.end(); iter++)
{
for (size_t i = 1; i < iter->length(); i++)
{
string former = iter->substr(0, i);
string latter = iter->substr(i);
if (dict.find(former) != dict.end() && dict.find(latter) != dict.end()) {
cout << *iter << endl;
break;
}
}
}
return 0;
}
/*
a
alien
born
less
lien
never
nevertheless
new
newborn
the
zebra
*/