UVA
来源:互联网 发布:pm2.5数据接口 编辑:程序博客网 时间:2024/06/15 06:08
/* 这题我开始时的思路是:合成单词,两两合成,看组合得到的合成词是否在字典中,但这样很明显会超时 最后查完题解,发现正确的思路是分割,不过分隔的做法也不止一种,具体见下:*/
/* 法一: 参考博客: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;}
/* 这题好像还可以用哈希表来做,但目前对哈希表还没有太明白,先放一下,晚点再去自学,学完来填坑*/
阅读全文
0 0
- uva
- UVA
- UVA
- UVA
- uva
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- UVA
- 大话PCIe:Linux访问PCIe空间
- codeforces 831D
- Android Servicer 播放音乐
- 你所知道的DOM事件
- 文件上传与拦截器
- UVA
- 记录下使用Ambari部署HDP集群的过程
- 洛谷 P2827 蚯蚓
- 嵌入式面试全攻略,记我的一次校招
- POJ2185 最小覆盖矩阵 (二维KMP)
- BZOJ 3295 [Cqoi2011]动态逆序对
- 51 nod 算法马拉松28 先序遍历与后序遍历
- C++类与对象学习
- 数字游戏---巧妙解答