uva 10391 Compound Words

这题还是很有意思的,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





  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值