题意:给出一个按字典序排好的词典,按照字典序顺序输出所有的复合词。复合词就是指这个单词是由给出词典的两个单词连接合成的。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;
}