Uva 10391

来源:互联网 发布:狸窝mp4视频转换器mac 编辑:程序博客网 时间:2024/06/05 01:54

一.题目

题目链接: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;}




原创粉丝点击