UVA 10391

来源:互联网 发布:域名交易 知乎 编辑:程序博客网 时间:2024/05/21 17:38

题意:给出一个按字典序排好的词典,按照字典序顺序输出所有的复合词。复合词就是指这个单词是由给出词典的两个单词连接合成的。N<=12W。

思路:首先我们把所有的单词都丢进map里,然后按照输入顺序判断每个单词是否是复合词。判断方法是枚举这个单词断开的位置,分成两个单词,然后在map检查一下这两个单词是否出现过。

#include <cstdio>#include <cmath>#include <cstring>#include <string>#include <cstdlib>#include <iostream>#include <algorithm>#include <stack>#include <map>#include <set>#include <vector>#include <sstream>#include <queue>#include <utility>using namespace std;#define rep(i,j,k) for (int i=j;i<=k;i++)#define Rrep(i,j,k) for (int i=j;i>=k;i--)map<string,int> flag;string str[120009],temp;int n = 0;bool check(string t){    string tx,ty;    int len = t.length();    rep(i,1,len-1)    {        tx = string( &t[0],&t[i] );        ty = string( &t[i],&t[len] );        if ( flag[tx] && flag[ty] ) return true;    }    return false;}int main(){    flag.clear();    while(cin>>temp)    {        str[++n] = temp;        flag[temp] = 1;    }    rep(i,1,n)        if ( check(str[i]) ) cout<<str[i]<<endl;    return 0;}


0 0
原创粉丝点击