紫书第五章训练2 F - Compound Words

F - Compound Words

You are to find all the two-word compound words in a dictionary. A two-word compound word is a 
word in the dictionary that is the concatenation of exactly two other words in the dictionary.

Input 
Standard input consists of a number of lowercase words, one per line, in alphabetical order. There will 
be no more than 120,000 words.

Output 
Your output should contain all the compound words, one per line, in alphabetical order.

Sample Input 

alien 
born 
less 
lien 
never 
nevertheless 
new 
newborn 
the 
zebra

Sample Output 
alien 
newborn

这个题就是找个单词是已出现两个单词的和,我用map写一直错, 我分析了下大概是每次都要访问map,然后map的空间就不够了,所以还是用set搞下不错,他和map的查询复杂度都是logn的,运用string还有find岂不是很简单实用,美滋滋

不过需要提出的是字典树或者直接数组搞会比stl速度快些的

#include <bits/stdc++.h>
using namespace std;
int main(){
string s;
set<string>ma;
while(cin>>s){
    ma.insert(s);
}
set<string>::iterator it;
for(it=ma.begin();it!=ma.end();it++){
    string c=*it;
    for(int i=1;c[i];i++){
        if(ma.find(c.substr(0,i))!=ma.end()&&ma.find(c.substr(i))!=ma.end()){
            cout<<c<<endl;
            break;
        }
    }
}

return 0;}
View Code

 

转载于:https://www.cnblogs.com/BobHuang/p/6842868.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值