Uva 10391 - Compound Words

一.题目

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




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值