这题还是很有意思的,wa了两三次,都是忽略了一些特殊情况,下面附上思路和代码和几个测试数据(数据自己写的)
思路:
任意一个单词(假设它为abcde)都有可能被任意组合出来(如a和bcde 或者ab和cde),此时就需要一个循环把所有的组合情况找出来,然后判断是否存在两个小组和能组合成这个大单词,如果此时用一个12万的循环那么一定是会超时的(12万*12万复杂度太高)。因此需要用map或者哈希,但是很不喜欢用哈希,所以还是用了map(话说按道理哈希应该是比map 快的吧)
代码:
#include<iostream>
#include<string>
#include<cstdio>
#include<map>
using namespace std;
map<string,int>m,M;//m用来计算某个单词出现过多少次,M用来判断某个单词在输出答案时是否已经输出过了,因为某个单词可能被多种组合组成,这时只需要输出一次,当 //然有其他方法,并且比这个简单:在i循环结束后再输出答案即可,不过当时懒得改了。
int main(){
string temp;
m.clear();//额,完全是一句废话,用途是清空m
while(cin>>temp){
m[temp]++;
M[temp]=1;
}
for(map<string,int>::iterator it=m.begin();it!=m.end();it++){
temp=(*it).first;
//cout<<temp<<"* ";
for(int i=0;i<temp.length();i++){
string t1,t2;
for(int j=0;j<=i;j++)t1+=temp[j];
for(int j=i+1;j<temp.length();j++)t2+=temp[j];
if(m[t1]>0 && m[t2]>0 && m[temp]>0 && M[temp]==1){//如果某个单词实际没有这两种组合也是不行的,所以要判断<span style="font-family: Arial, Helvetica, sans-serif;">m[t1]>0 && m[t2]>0 </span>
M[temp]=0;
int TEMP=m[temp];
while(TEMP--)
cout<<temp<<endl;
}
}
}
<span style="white-space:pre"> </span>return 0;
}
附测试数据三个:
a
abc
abcde
bcde
de
a
ab
abc
abcd
abcde
b
c
d
e
a
a
a
ab
ab
b
b
b