[刷题]算法竞赛入门经典(第2版) 5-5/UVa10391 - Compound Words
来源:互联网 发布:知乎 闲书 编辑:程序博客网 时间:2024/06/05 01:08
题意:问在一个词典里,那些单词是复合词,即哪些单词是由两个单词拼出来的。
渣渣代码:(Accepted, 30ms)
//UVa10391 - Compound Words#include<iostream>#include<string>#include<set>using namespace std;set<string> dic;int main(){ //freopen("in.txt", "r", stdin); string w; while (cin >> w) dic.insert(w); for (const auto &r : dic) { int s = r.size(); for (int i = 1;i < s;++i) { if (dic.count(r.substr(0, i)) && dic.count(r.substr(i, s - i))) { cout << r << '\n'; break; } } } return 0;}
分析:遍历两遍词典找出两个单词来找/判断复合词肯定不行,慢死了,肯定只能是拆当前单词拆成两部分,枚举所有可拆分的情况,看这两部分有没有找到两个独立的单词。于是用了如上面的超简单的方法,但是30ms。学习他们的0ms至10ms的做法,发现他们都用了hash。我不知道什么是hash,一下子看他们代码也看的一愣一愣的。看了一下午代码和hash资料了,累死了。。明天继续改进这题,今天我要歇息下了。明天再会更新此博客。
更新:对hash还不熟,但是自己做了一下,但是总是Runtime error!我要哭了,自己做了N组不同的测试数据,没有任何异常,但是提交总是RE!为什么啊!!!!:
垃圾代码:(Runtime Error, –)
//UVa10391 - Compound Words#include<cstdio>#include<cstring>const int mdic = 120200, d[] = { 4616,177,7 };char dic[mdic][40];int hash(char* s) { int re = 0; for (int i = 0;s[i] && i < 3;++i) re = (s[i] - 'a')*d[i]; return re;}bool find(char* s) { int h = hash(s); while (strcmp(s, dic[h]) > 0) ++h; if (strcmp(s, dic[h])) return 0; return 1;}int main(){ freopen("in.txt", "r", stdin); memset(*dic, 0, sizeof(*dic)); char w[40], (*p)[40] = dic; while (scanf("%s", w) != -1) { int h = hash(w); while (dic[h][0]) ++h; strcpy(dic[h], w); } for (int I = 0;I < mdic;++I, ++p) { if (!*p) continue; int len = strlen(*p); for (int i = 1;i < len;++i) { char a[40], b[40]; strncpy(a, *p, i);a[i] = 0; strcpy(b, *p + i); if (find(a) && find(b)) printf("%s\n", *p); } } return 0;}
分析:尽量按照自己的想法做的。对于获得hash那个函数,我也是自己想的(4616=120010/26,177=120010/26/26,7=120010/26/26/26),不知道高人有什么看法。还有再次声明:这个代码是RE的!!我测试了好多数据都没问题,一到oj上就RE。。好歹来个WA啊啊啊(哇的一声就哭了)
就我自己的测试数据,上面的版本用时2136,下面的4726。。。。怎么还慢了。。不服。。以后学精了再说吧。
0 0
- [刷题]算法竞赛入门经典(第2版) 5-5/UVa10391 - Compound Words
- 算法竞赛入门经典 第二版 习题5-5 复合词 Compound Words uva10391
- 算法竞赛入门经典(第2版)习题5-5 复合词 UVa10391
- 算法竞赛入门经典 习题5-5 复合词 UVa10391
- uva10391 - Compound Words
- UVA10391- Compound Words
- UVa10391 - Compound Words
- UVa10391 - Compound Words
- UVA10391 Compound Words
- UVA10391:Compound Words(复合词)
- 《算法竞赛入门经典(第2版)》
- [二分查找]Compound Words uva10391
- [UVA10391]Compound Words[map][实现]
- UVa10391-- Compound Words(字符串hash)
- [刷题]算法竞赛入门经典(第2版) 5-2/UVa1594 - Ducci Sequence
- [刷题]算法竞赛入门经典(第2版) 4-5/UVa1590 - IP Networks
- [刷题]算法竞赛入门经典(第2版) 5-1/UVa1593 - Alignment of Code
- [刷题]算法竞赛入门经典(第2版) 5-3/UVa10935 - Throwing cards away I
- trafficserver安装配置
- 【基础试题】数组元素的操作 Time Limit:1000MS Memory Limit:65536K Total Submit:441 Accepted:225 Description
- Maven插件的编写
- aapt的常用命令
- HDU2289
- [刷题]算法竞赛入门经典(第2版) 5-5/UVa10391 - Compound Words
- android 权限
- 《人类简史》笔记
- 2015年湖南省省赛E题 简单的图论问题 CSU1780
- 扩展方法
- HTML5——7个最牛的HTML5移动开发框架
- L3-004. 肿瘤诊断-PAT团体程序设计天梯赛GPLT(广度优先搜索)
- mac os 10.10以上的开启端口转发-解决mac默认不开启1024以下端口权限问题
- dx命令详解