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

目录
相关文章
HDU 2669 Romantic
题意:找出最小的非负整数X,使之满足式子X*a + Y*b = 1。
|
Java BI
HDU 1412 {A} + {B}
{A} + {B} Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 19833    Accepted Submission(s): 8245 Problem Description 给你两个集合,要求{A} + {B}.
810 0
|
测试技术 Java
|
人工智能
hdu2084数塔
经典问题了,题意我就不叙述了(题目是中文的~) 分析:dp[i][j]表示在第i行第j个位置上能取得的最大和,那么要从最后一行开始算起,到塔顶结束:dp[i][j] = a[i][j]+max(dp[i+1][j], dp[i+1][j+1]), 边界条件是dp[n][j] = a[n][j]; ...
648 0
|
算法
hdu 2923 Einbahnstrasse
点击打开链接hdu 2923 思路:最短路+SPFA / 最短路+floyd 分析: 1 题目要求的是有n个点,然后有c个破车,这个c个破车可能在同一城市里面,现在要把这些破车统一拉到中心点1. 2 这题的中心在1点,那么所求 ans = 1->所有破车的距离之和 + 所有破车->1的之和。
700 0