/* 这题我开始时的思路是:合成单词,两两合成,看组合得到的合成词是否在字典中,但这样很明显会超时 最后查完题解,发现正确的思路是分割,不过分隔的做法也不止一种,具体见下: */
/* 法一: 参考博客: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; }
/* 这题好像还可以用哈希表来做,但目前对哈希表还没有太明白,先放一下,晚点再去自学,学完来填坑 */