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次。

目录
相关文章
uva10152 ShellSort
uva10152 ShellSort
66 0
uva10112 Myacm Triangles
uva10112 Myacm Triangles
47 0
概率dp - UVA 11021 Tribles
Tribles  Problem's Link:  http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=33059   Mean:  有k个细菌,每个细菌只能存活一天,在死去之前可能会分裂出0,1,2....n-1个细菌,对应的概率为p0,p1,p2....pn-1。
834 0
|
算法
UVA题目分类
题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics 10300 - Ecological Premium 458 - The Decoder 494...
1574 0
|
机器学习/深度学习
uva 11538 Chess Queen
点击打开链接 题意:给定一个n*m的矩阵,问有多少种方法放置两个相互攻击的皇后?规定在同一行同一列和同对角线的能够相互攻击 思路: 1 先考虑同一行的情况,n行就有n种情况,每一行有m*(m-1)种,总的是n*m*(m-1); 2 考虑同...
825 0
uva 10273 Eat or Not to Eat?
点击打开链接uva 10273 思路: 暴力求解 分析: 1 题目要求没有吃掉的奶牛的个数已经最后一次吃掉奶牛的天数 2 没有其它的方法只能暴力,对于n头牛的n个周期求最小公倍数,然后在2个公倍数之内暴力求解 代码: #inclu...
833 0
uva 1160 X-Plosives
点击打开链接uva 1160 思路: 并查集 分析: 1 看懂题目之和就是切菜了 代码: #include #include #include #include using namespace std; const int MAXN...
775 0
uva 1388 - Graveyard
点击打开链接uva1388 思路:数学 分析: 1 我们把原先的n个墓碑看成是园内的正n变形,现在的n+m个墓碑看成是园内的正n+m变形。那么通过画图我们可以知道当这个两个正多边形有一个点重合的时候移动的总距离最小 2 那么我们把这个圆进...
1019 0

热门文章

最新文章

下一篇
开通oss服务