一.题目
题目链接:Uva10391
二.思路
看到题目啥都没想,集合保存原来的单词,直接上手两个for循环遍历拼接单词,然后再集合里找是否已经存在,一提交超时。我们可以反其道而行,将每个单词拆分,因为单词长度一般都不会太长,一个单词顶多也就遍历个几十次,比起120000这个级数要小的多,然后结果集也要用集合存储,不要直接输出,因为像zzz这种,(z,zz)和(zz,z)都能构成zzz,直接输出的话会输出两次,详情看代码注释。
三.源代码
#include <algorithm>
#include <iostream>
#include <set>
#include <stdio.h>
using namespace std;
int main() {
set<string> s_words;
set<string> results;
string word, temp1, temp2;
while (cin >> word)
s_words.insert(word);
for (set<string>::iterator iter = s_words.begin(); iter != s_words.end();
iter++) {
//迭代器遍历,把一个单词分割成两个部分,然后判断集合里是否存在这两个单词
for (int i = 1; i < (*iter).length(); i++) {
temp1 = (*iter).substr(0, i);
temp2 = (*iter).substr(i, (*iter).length() - i);
if (s_words.count(temp1) && s_words.count(temp2))
results.insert((*iter));
}
}
for (set<string>::iterator iter = results.begin(); iter != results.end();
iter++)
//遍历输出
printf("%s\n", (*iter).c_str());
return 0;
}