poj 3274 Gold Balanced Lineup, 链地址hash
来源:互联网 发布:龙与地下城 知乎 编辑:程序博客网 时间:2024/05/24 05:08
sum[i][j] 表示从第1到第i头cow属性j的出现次数
所以题目要求等价为:
求满足
sum[i][0]-sum[j][0]=sum[i][1]-sum[j][1]=.....=sum[i][k-1]-sum[j][k-1] (j<i)
中最大的i-j
将上式变换可得到
sum[i][1]-sum[i][0] = sum[j][1]-sum[j][0]
sum[i][2]-sum[i][0] = sum[j][2]-sum[j][0]
......
sum[i][k-1]-sum[i][0] = sum[j][k-1]-sum[j][0]
令C[i][y]=sum[i][y]-sum[i][0] (0<y<k)
初始条件C[0][0~k-1]=0
所以只需求满足C[i][]==C[j][] 中最大的i-j,其中0<=j<i<=n。
C[i][]==C[j][] 即二维数组C[][]第i行与第j行对应列的值相等,
那么原题就转化为求C数组中 相等且相隔最远的两行的距离i-j。
将C[i]进行hash,
这样就可以高效的找到i前面C[i]=C[j]的所有j了。
采用拉链式hash表能有效的避免冲突
#include<cstdio>#include<cstring>#include<algorithm>using namespace std;const int maxn = 100000 + 5;const int maxk = 30 + 5;const int mod = 99983;int sum[maxn][maxk], c[maxn][maxk];int head[maxn], next[maxn], v[maxn], ecnt;int n, k;void addedge(int a, int b) { next[ecnt] = head[a]; head[a] = ecnt; v[ecnt] = b; ecnt++;}// BKDR Hash Functionint hash(int *v) { unsigned int seed = 131; // 31 131 1313 13131 131313 etc.. unsigned int hash = 0; for(int i=0; i<k; ++i) hash = hash * seed + v[i]; return (hash & 0x7FFFFFFF) % mod;}int main() { memset(sum, 0, sizeof sum ); memset(c, 0, sizeof c ); memset(head, -1, sizeof head ); ecnt = 0; int ans = 0; addedge(hash(c[0]), 0); scanf("%d%d", &n, &k); for(int i=1; i<=n; ++i) { int a; scanf("%d", &a); for(int j=0; j<k; ++j) { sum[i][j] = sum[i-1][j] + (1&a); c[i][j] = sum[i][j] - sum[i][0]; a >>= 1; } int h = hash(c[i]); for(int j=head[h]; j != -1; j=next[j]) { bool flag = true; for(int p=0; p<k; ++p) if(c[v[j]][p] != c[i][p]) { flag = false; break; } if(flag && ans < i-v[j]) ans = i - v[j]; } addedge(h, i); } printf("%d\n", ans); return 0;}/*7 37672142ans:4*/
0 0
- poj 3274 Gold Balanced Lineup, 链地址hash
- POJ 3274 Gold Balanced Lineup(HASH)
- POJ 3274 GOLD BALANCED LINEUP(HASH)
- POJ 3274 Gold Balanced Lineup (hash)
- POJ Gold Balanced Lineup(3274)-神Hash
- POJ 3274 Gold Balanced Lineup (hash)
- POJ 3274 - Gold Balanced Lineup(Hash)
- poj 3274 Gold Balanced Lineup(hash)
- poj 3274 Gold Balanced Lineup Hash
- POJ---3274-Gold Balanced Lineup(hash)
- POJ 3274 Gold Balanced Lineup hash
- POJ 3274 Gold Balanced Lineup 数组Hash
- 【POJ】3274 Gold Balanced Lineup 哈希hash
- POJ---3274[Gold Balanced Lineup] 数组的hash
- POJ-3274(hash结构)(Gold Balanced Lineup )
- POJ 3274 Gold Balanced Lineup
- POJ 3274 Gold Balanced Lineup
- POJ 3274 Gold Balanced Lineup
- cdecl、stdcall、fastcall函数调用约定区别
- Java中的日志处理
- POJ3077 Rounders
- cocos2dx 帧动画的两种创建方式
- acm steps1.2.8(Identity Card)
- poj 3274 Gold Balanced Lineup, 链地址hash
- POJ 2318 TOYS
- 如何用OpenCV训练自己的分类器
- android 动画切换效果
- UITableView and presentViewController takes 2 clicks to display
- android View的一些学习记录
- Redis在windows下的安装使用
- Java Compilation Process
- 【ThinkPHP学习】ThinkPHP的模块绑定与域名部署