codevs 2147 数星星
时间限制: 3 s
空间限制: 64000 KB
题目等级 : 钻石 Diamond
题目描述 Description
小明是一名天文爱好者,他喜欢晚上看星星。这天,他从淘宝上买下来了一个高级望远镜。他十分开心,于是他晚上去操场上看星星。
不同的星星发出不同的光,他的望远镜可以计算出观测到的星星发出的光的数值W。小明当然想尽可能地多看到星星,于是他每看到一颗星星,就要看看他之前有没有看过这颗星星。但是他看的星星太多了,他根本数不过来,于是他让你帮忙。
输入描述 Input Description
共有两行,第一行只有一个整数,为小明观测到的星星的数量n。第二行有n个整数,每两个整数由一个空格隔开,分别为小明观测到每颗星星的光的数值W[1]-W[n]。
输出描述 Output Description
只有一行,这一行共有n个数字0或1。0表示对应的星星之前没有观测到,1表示对应的星星之前已经看过了。注意:数字之间没有空格!
样例输入 Sample Input
5
1 5 5 4 1
样例输出 Sample Output
00101
数据范围及提示 Data Size & Hint
样例是往往是骗人的,本题中
30%的数据,0<n≤5000。
20%的数据,-20000≤W≤20000。
60%的数据,0<n≤50000。
100%的数据,0<n≤500000;-2000000000≤W≤2000000000。
哈希 点击传送
33分 WA+RE代码存档 (数组开小,没考虑负数)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #define mo 13831 using namespace std; int tot,head[100001],n,i,w; struct node { int next,to; }e[100001]; bool hash(int k) { int h=0; while(k) { h=h*13+k; k/=10; } h=h%mo; for(i=head[h];i;i=e[i].next) { if(e[i].to==w) return true; } tot++; e[tot].next=head[h]; e[tot].to=w; head[h]=tot; return false; } int main() { cin>>n; while(n--) { cin>>w; if(hash(w)) cout<<"1"; else cout<<"0"; } } /* 运行结果 测试点#1.in 结果:AC 内存使用量: 492kB 时间使用量: 13ms 测试点#2.in 结果:AC 内存使用量: 364kB 时间使用量: 13ms 测试点#3.in 结果:AC 内存使用量: 360kB 时间使用量: 13ms 测试点#4.in 结果:RE 内存使用量: 876kB 时间使用量: 33ms 测试点#5.in 结果:RE 内存使用量: 872kB 时间使用量: 61ms 测试点#6.in 结果:WA 内存使用量: 1260kB 时间使用量: 142ms 测试点#large.in 结果:RE 内存使用量: 872kB 时间使用量: 58ms 测试点#large2.in 结果:RE 内存使用量: 360kB 时间使用量: 9ms 测试点#large3.in 结果:RE 内存使用量: 616kB 时间使用量: 16ms */
66分 RE代码 (数组开小)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #define mo 13831 using namespace std; int tot,head[100001],n,i,w; struct node { int next,to; }e[100001]; bool hash(int k) { int h=0; while(k) { h=h*13+k; k/=10; } h=h%mo; if(h<0) h=h*(-1); h+=233;//应该随便加一个质数就好 。 for(i=head[h];i;i=e[i].next) { if(e[i].to==w) return true; } tot++; e[tot].next=head[h]; e[tot].to=w; head[h]=tot; return false; } int main() { cin>>n; while(n--) { cin>>w; if(hash(w)) cout<<"1"; else cout<<"0"; } } /* 运行结果 测试点#1.in 结果:AC 内存使用量: 364kB 时间使用量: 12ms 测试点#2.in 结果:AC 内存使用量: 360kB 时间使用量: 11ms 测试点#3.in 结果:AC 内存使用量: 364kB 时间使用量: 11ms 测试点#4.in 结果:AC 内存使用量: 1004kB 时间使用量: 134ms 测试点#5.in 结果:AC 内存使用量: 1132kB 时间使用量: 137ms 测试点#6.in 结果:AC 内存使用量: 1260kB 时间使用量: 138ms 测试点#large.in 结果:RE 内存使用量: 2412kB 时间使用量: 298ms 测试点#large2.in 结果:RE 内存使用量: 2412kB 时间使用量: 299ms 测试点#large3.in 结果:RE 内存使用量: 2284kB 时间使用量: 293ms */
100分 哈希代码 就是太慢了 = =| 长度575B 时间5404ms
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <algorithm> #include <iostream> #include <cstring> #include <cstdio> #define mo 13831 using namespace std; int tot,head[1000001],n,i,w; struct node { int next,to; }e[1000001]; bool hash(int k) { int h=0; while(k) { h=h*13+k; k/=10; } h=h%mo; if(h<0) h=h*(-1); h+=233; for(i=head[h];i;i=e[i].next) { if(e[i].to==w) return true; } tot++; e[tot].next=head[h]; e[tot].to=w; head[h]=tot; return false; } int main() { cin>>n; while(n--) { cin>>w; if(hash(w)) cout<<"1"; else cout<<"0"; } }
100分 STL代码 更慢但简单了不只一点。。代码长度179B 时间 6559ms
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <map> using namespace std; map<int,int>q; int main() { int n; cin>>n; int a; while(n--) { cin>>a; cout<<q[a]; q[a]=1; } }
我们都在命运之湖上荡舟划桨,波浪起伏着而我们无法逃脱孤航。但是假使我们迷失了方向,波浪将指引我们穿越另一天的曙光。