UVA10391

简介: 题意:给定单词集合S,包含若干单词,找出S中所有满足这样条件的元素p:p==str1+str2 && str1属于S && str2属于S解法:暴力搜;或者用set的查找函数 You are to find all the two-word compound words in a dictionary.

题意:给定单词集合S,包含若干单词,找出S中所有满足这样条件的元素p:p==str1+str2 && str1属于S && str2属于S
解法:暴力搜;或者用set的查找函数

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

a alien born less lien never nevertheless new newborn the zebra

 

Sample Output

alien newborn


set的搜索:
#include<iostream>
#include<set>
using namespace std;

int main() {
    set<string> s;
    string tmp;
    while (cin >> tmp)
        s.insert(tmp);
    set<string>::iterator it = s.begin();
    for (it; it != s.end(); it++) {
        tmp = *it;
        for (int i = 1; i < tmp.length(); i++) {
            if (s.find(tmp.substr(0, i)) != s.end() && s.find(tmp.substr(i, tmp.length() - i)) != s.end()) {
                cout << tmp << endl;
                break;
            }
        }
    }
    return 0;
}

暴力搜:
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int main(){
    //    freopen("in.txt","r",stdin);
    vector<string>vs[26];
    string s;
    while(getline(cin,s))
        if(s.length())vs[s[0]-'a'].push_back(s);
    for(int i=0; i<26; i++){
        if(vs[i].size()>=2){
            for(int j=1; j<vs[i].size(); j++){
                bool judge = true;
                for(int k=0; k<j; k++){
                    if(vs[i][j].find(vs[i][k])==0){
                        string t = vs[i][j].substr(vs[i][k].length());
                        if(!vs[t[0]-'a'].empty()){
                            for(int z=0; z<vs[t[0]-'a'].size(); z++){
                                if(vs[t[0]-'a'][z]==t){
                                    if(judge)cout << vs[i][j] << endl;
                                    judge = false;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    return 0;
}


找到单词后注意标记,保证只输出1次。

目录
相关文章
UVa10123 No Tipping
UVa10123 No Tipping
59 0
UVa 10082 WERTYU
UVa 10082 WERTYU
125 0
|
算法
UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494...
1563 0
|
C++
UVA 之10010 - Where's Waldorf?
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/SunnyYoona/article/details/24863879 ...
710 0
uva 10273 Eat or Not to Eat?
点击打开链接uva 10273 思路: 暴力求解 分析: 1 题目要求没有吃掉的奶牛的个数已经最后一次吃掉奶牛的天数 2 没有其它的方法只能暴力,对于n头牛的n个周期求最小公倍数,然后在2个公倍数之内暴力求解 代码: #inclu...
812 0
uva 10730 - Antiarithmetic?
点击打开链接uva 10730 思路:枚举等差中项 分析: 1 给定一个n个数的序列判断是否有等差子序列 2 很明显我们如果要判断是否有等差子序列的话,只要去判断是否有长度为3的等差子序列 3 对于n
840 0
uva10465Homer Simpson
题意:HM先生喜欢吃汉堡,有两种汉堡,每种无限多个,吃完第一种的汉堡一个需要m时间,第二种需要n时间,HM先生饭量很大可以不停的吃,给定一个时间t,在t时间段内希望HM先生吃尽量多的汉堡,并且空余出来的时间要尽量少 分析:是一个只有两种元素的完全背包问题。
721 0
|
安全
UVA3644
题意:有一些简单化合物,每个化合物都由两种元素组成,每个元素用一个大写字母组成,你是一个装箱工人,从实验员那里按照顺序依次把一些简单化合物装到车上,但是这里存在一个安全隐患,如果车上存在k个简单化合物,正好包含k中元素,那么他们将组成一个易爆易燃的化合物,为了安全起见,每当你拿到一个化合物的时候,如果他和已装车的化合物形成易爆化合物,你就应当拒绝装车,否则就应该装车,编程输出有多少个没有装车的化合物。
517 0
|
人工智能
uva10382 Watering Grass
题意:有一块草坪,长为l,宽为w,再起中心线的不同位置处装有n个点状的喷水装置。每个喷水装置i可以将以它为中心,半径为ri的圆形区域润湿,请选择尽量少的喷水装置,把整个草坪全部润湿。 分析:对于直径小于宽度的喷水装置其实可以忽略,剩下的问题转换成了最小区间覆盖问题,即:用最少数量的区间去覆盖给定的...
816 0