UVA - 10391 Compound Words

/*
  这题我开始时的思路是:合成单词,两两合成,看组合得到的合成词是否在字典中,但这样很明显会超时
  
  最后查完题解,发现正确的思路是分割,不过分隔的做法也不止一种,具体见下:
*/



/*
  法一:
  参考博客:http://blog.csdn.net/czjxy881/article/details/8300237
  
A.  
  注意先说下博客里的代码,有两个不太妥当的地方
  1. 定义map时,定义的名称是hash,导致编译时出现了二义性的错误,猜测应该是hash和STL里面的hash重名了,所以此处应改
  
  2. 还有一个问题,就是之前曾经提到过的,使用map[key]之前,务必先检查键值是否存在,否则,可能会导致错误
  
  再复制一次:
  如果map不包含key,使用下标有一个危险的副作用,会在map中插入一个key的元素,value取默认值,返回value。也就是说,map[key]不可能返回null
  
  然而这个地方,我觉得不太妥当,但是oj居然没有报错,我觉得有些不可思议,可能value设定的默认值,恰好地使得后台数据通过了吧...不过,还是不要赌这个运气了,语法上的坑,还是不要踩为好
  
B.
  这种方法的思路:
  思路就是,每个单词分成的两个单词,将所有的分法判断一下,分出的两部分是否都在词典里存在,如果都存在,说明这个单词本身是满足条件的复合词
  
  唉,感慨一下,我这么就想不到呢~明明STL这些,我也算是做了些题,也学了一段时间了...
  
C. 
   收获:
   那个博主的substr()函数用的可真巧妙啊!
*/

#include <iostream>
#include <string>
#include <map>
using namespace std;
const int maxn = 120000 + 100;
string s[maxn];
map<string, bool> is_in;

int main()
{
	int cnt = 0;
	while (cin >> s[cnt])
	{
		is_in[s[cnt]] = 1;
		cnt++;
	}
	for (int i = 0; i < cnt; i++)
	{
		for (int j = 0; j < (int)s[i].size() - 1; j++)
		{
			string a = s[i].substr(0, j + 1);
			string b = s[i].substr(j + 1);
			if (is_in.find(a) == is_in.end() || is_in.find(b) == is_in.end()) continue;
			cout << s[i] << endl;
			break;
		}
		
	}
	return 0;
}

/*
  这题好像还可以用哈希表来做,但目前对哈希表还没有太明白,先放一下,晚点再去自学,学完来填坑
*/


posted @ 2017-09-03 20:23  mofushaohua  阅读(213)  评论(0编辑  收藏  举报