poj 3274 数的哈希
据说这题很经典噢~开始的分析也经典。题目的分析我就不多说了,具体可以参考:http://blog.csdn.net/chinaczy/article/details/5790107一看就很清楚了(感谢这位博主)。但他用的hash函数我暂时是不能理解,说以没用它的方法。自己写了个简单的hash方法,似乎还挺凑效,然后再处理冲突。一开始时,我是先hash一边,然后再来个for循环来判断每个hash值....TLE。不行啊,然后换了个方法,hash和找最大值同步进行,这样就省去了最后的一次遍历,很能节省时间。还有就是要注意前导的全零,没有的话就WA.我就错了好多次,后来看了discuss才明白的,感谢那里面的大牛。比如测试这个:
4 4 一开始我输出的是零。。才发现没有前导的零。。改了之后AC了。嘿嘿!!不错不错 通过这题,对hash又有了深刻的认识。
1
2
4
8
#include <iostream> #include <cmath>using namespace std;#define MAX 100001 int a[MAX][31]; int n,k,maxlen=0,dist;struct Hash{int index;bool used;Hash *next;Hash(){index=0; used=false; next=NULL;} }hash[MAX];bool cmp(int ai,int bi) {for(int i=0; i<k; i++)if(a[ai][i]!=a[bi][i])return false;return true; }int main() {freopen("acm.txt","r",stdin);int i,j,num;scanf("%d%d",&n,&k);for(i=0; i<k; i++) //第一个放全0 {a[0][i]=0;}i=1; while(1){if(i>n)break;scanf("%d",&num);for(j=k-1; j>=0; j--){ //存储每一二进制位a[i][j]=num & 1;num=num>>1;}i++;}int tem;for(i=1; i<=n; i++){for(j=k-1; j>=0; j--){a[i][j]+=a[i-1][j];}}for(i=0; i<=n; i++){tem=a[i][k-1]; //暂存最低位for(j=k-1; j>=0; j--)a[i][j]=abs(a[i][j]-tem);}//转存hashfor(i=0; i<=n; i++){int sum=0;bool flag=false;for(j=0; j<k; j++){sum+=a[i][j]*(j+1);}if(hash[sum].used) //冲突 {Hash *tem=&hash[sum];if(cmp(tem->index,i)) //比较是否相等 {dist=i-hash[sum].index;if(dist>maxlen)maxlen=dist;continue; //继续下次 }else{while(tem->next!=NULL){if(cmp(tem->next->index,i)){dist=i-tem->next->index;if(dist>maxlen)maxlen=dist;flag=true; //已经有相等的break; //跳出while }tem=tem->next;}}if(!flag)//没有找到相等的 {Hash *H=new Hash();H->index=i;tem->next=H;}}else //没有冲突 {hash[sum].index=i;hash[sum].used=true;}}printf("%d\n",maxlen);return 0; }
转载于:https://www.cnblogs.com/Jason-Damon/archive/2012/04/11/2442750.html
poj 3274 数的哈希相关推荐
- LeetCode 1056. 易混淆数(哈希)
文章目录 1. 题目 2. 解题 1. 题目 给定一个数字 N,当它满足以下条件的时候返回 true: 原数字旋转 180° 以后可以得到新的数字. 如 0, 1, 6, 8, 9 旋转 180° 以 ...
- LeetCode 246. 中心对称数(哈希)
文章目录 1. 题目 2. 解题 1. 题目 中心对称数是指一个数字在旋转了 180 度之后看起来依旧相同的数字(或者上下颠倒地看). 请写一个函数来判断该数字是否是中心对称数,其输入将会以一个字符串 ...
- POJ NOI0105-40 数1的个数
问题链接:POJ NOI0105-40 数1的个数. 总时间限制: 1000ms 内存限制: 65536kB 描述 给定一个十进制正整数n,写下从1到n的所有整数,然后数一下其中出现的数字" ...
- POJ 3274 Gold Balanced Lineup(哈希)
题目链接 很难想.会哈希,但是想不出.需要一个转化,本来是求某一段上的二进制上每一位的1数目相等,转化为找两段相等的,换元可推出公式.最后注意特判.. 1 #include <iostream& ...
- 【POJ 3274】Gold Balanced Lineup (stl map )设计hash表,处理碰撞
题目链接 题目链接 http://poj.org/problem?id=3274 题意 输入每头牛的特征的10进制,若i~j头牛中每个数位的特征相等则满足要求,求所有满足要求的j-i的最大值. 解题思 ...
- leetcode 792 匹配子序列的单词数(哈希表+双指针)
792. 匹配子序列的单词数 中等 282 相关企业 给定字符串 s 和字符串数组 words, 返回 words[i] 中是s的子序列的单词个数 . 字符串的 子序列 是从原始字符串中生成的新字符 ...
- 两数相加——哈希表算法
力扣刷题总结 一.前言 二.两数相加 1.题意 2.示例 3.题目解析 4.官方题解 思路分析 哈希表算法的优势: 思路及算法: 代码分析 C语言代码实现及详细注释说明: python代码实现及详细注 ...
- Gold Balanced Lineup - poj 3274 (hash)
这题,看到别人的解题报告做出来的,分析: 大概意思就是: 数组sum[i][j]表示从第1到第i头cow属性j的出现次数. 所以题目要求等价为: 求满足 sum[i][0]-sum[j][0]=sum ...
- POJ - 3974 Palindrome(二分+哈希/马拉车)
题目链接:点击查看 题目大意:给出一个字符串,求字符串中最长的回文子串,这个字串可以包含主串本身 题目分析:这个题就是之前徐州网络赛的那个回文题目的弱化版..那个题目正解是要用回文自动机,但我不会,当 ...
最新文章
- 特约专栏丨陈纯院士:大规模动态时序图实时处理技术、平台及应用
- live555工程建立与调试
- 位运算及在java中的应用整理
- 2015-4-20 BAV推广页面修改前后对比-安全网购
- mybatis中foreach标签详解
- 电脑卡顿不流畅怎么解决_电脑用久了卡怎么办?学会这四招解决你的电脑卡顿问题...
- 小程序开发好学吗?需要掌握哪些知识技能?
- 去除dataframe中的空行_Word中这些一键操作实在太强了!折腾半天的工作,一秒就能搞定!...
- 教你辨别Access用户级安全的两个密码
- ae效果英文版翻译对照表_用AE设计动态海报教程
- Keil5 解决编译通过显示红叉
- IDEA主题设置,自定义主题
- Linus 没空实现的功能,开发者做到了:苹果 M1 Mac 成功运行原生 Linux!
- java烟花代码详细步骤,一文说清!
- CSS3动画入门 CSS动画如何使用(举例说明)
- 英语练习95 Computers
- mysql单表瓶颈_mysql单表性能瓶颈_优化系列 | 实例解析MySQL性能瓶颈排查定位-云栖社区-阿里云...
- python小作业8代码(列表的遍历与嵌套)
- MacBook Pro出现kernel_task占用CPU非常高问题
- Python---元祖、循环