POJ-3274 Gold Balanced Lineup---hash经典题!
题目链接:
https://vjudge.net/problem/POJ-3274
题目大意:
给定多头牛的属性,每头牛的属性由一个非负数表示,该数的二进制表示不会超过K位,它的二进制表示的每一位若为1则表示该牛有对应的第i种属性,若为0则表示没有该属性。
对于给定的牛的顺序,要求输出某一段子序列的长度,这个子序列中的牛的K个属性对应相加以后全部相等。
假设n=3, k = 3
输入的3个数变成的二进制分别为(a1, a2, a3), (b1, b2, b3), (c1, c2, c3)
设sum(i)为从第1个数到第i个数的属性和的序列
若从第2个数到第3个数的序列满足条件,则说明b1+c1 = b2+c2 = b3+c3,即sum(3)-sum(2)的序列每一位都相等
推广一下,若sum(i) = (a, b, c),sum(j) = (d, e, f),且i到j这个子序列满足条件,则说明(d, e, f) - (a, b, c) = (x, x, x),即(d, e, f) = (a + x, b + x, c + x)。每个序列中的数都减去序列中的最后一个数,得到(d - f, e - f, 0) = (a - c, b - c, 0)。因此只要判断两个完全转换过后的序列是否相同,就可以知道它们之间的原序列是否满足条件了。
所以解题的第一步是把原来的数转换为二进制序列,第二步是把二进制序列转换成sum序列,即逐步叠加,第三步是把每个sum序列都减去该序列的最后一个数,最后一步是把这些序列进行哈希,计算它们的最大差距。
有一点要注意,如果从第1个数到第i个数这段序列满足条件,即sum(i) - sum(0) = (x, x, x),则说明sum(i)的各个位都是相同的,因此需要在第三步之前先做这个判断,把符合条件的序列找出来,更新一下答案。所以在hash的时候先存入hash(0)
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<map>
#include<set>
#include<cmath>
using namespace std;
const int maxn = + ;
const int mod = ;
int num[maxn][];
int n, k;
int maxlen;
struct hashtable
{
int x;
hashtable * next;
hashtable(){next = ;}
};
hashtable * Hash[mod]; bool Equal(int i, int j)
{
for(int c = ; c < k; c++)
if(num[i][c] != num[j][c])return false;
return true;
}
void Hash_Insert(int i)
//根据关键字key找hash位置, 找到位置后存i表示第i行
{
int key = ;
for(int j = ; j < k; j++)
key += j * num[i][j];
key = abs(key) % mod;
if(!Hash[key])//链表的第一个key
{
hashtable* p = new hashtable;
p -> x = i;
Hash[key] = p;
}
else//产生冲突
{
hashtable * p = Hash[key];
if(Equal(p->x, i))//如果和第i行相等
{
int dist = i - (p -> x);
maxlen = max(maxlen, dist);
}
else
{
while(p->next)//判断p->next是否存在,之后直接判断p->next存的行数和当前行数比较
{
if(Equal(p->next->x, i))
{
int dist = i - (p -> next -> x);
maxlen = max(maxlen, dist);
return;//不用存储i,直接返回,因为已经有和i一样的
}
p = p->next;
}
//地址冲突但是和每个冲突的都不相同
hashtable* temp = new hashtable;
temp->x = i;
p->next = temp;
}
}
return;
}
int main()
{
scanf("%d%d", &n, &k);
int x;
for(int i = ; i <= n; i++)
{
scanf("%d", &x);
for(int j = ; j < k; j++)
if(x & ( << j))num[i][j] = ;
for(int j = ; j < k; j++)
num[i][j] += num[i - ][j];
}
for(int i = ; i <= n; i++)
{
for(int j = ; j < k; j++)
num[i][j] -= num[i][];
}
for(int i = ; i <= n; i++)Hash_Insert(i);//从第0行开始
cout<<maxlen<<endl;
}
POJ-3274 Gold Balanced Lineup---hash经典题!的更多相关文章
- POJ 3274 Gold Balanced Lineup
Gold Balanced Lineup Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 10924 Accepted: 3244 ...
- POJ 3274 Gold Balanced Lineup(哈希)
http://poj.org/problem?id=3274 题意 :农夫约翰的n(1 <= N <= 100000)头奶牛,有很多相同之处,约翰已经将每一头奶牛的不同之处,归纳成了K种特 ...
- poj 3274 Gold Balanced Lineup(哈希 )
题目:http://poj.org/problem?id=3274 #include <iostream> #include<cstdio> #include<cstri ...
- POJ 3274 Gold Balanced Lineup 哈希,查重 难度:3
Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been able to narrow ...
- Gold Balanced Lineup(hash)
http://poj.org/problem?id=3274 ***** #include <stdio.h> #include <iostream> #include < ...
- poj3274 Gold Balanced Lineup(HASH)
Description Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been abl ...
- POJ 3274:Gold Balanced Lineup 做了两个小时的哈希
Gold Balanced Lineup Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13540 Accepted: ...
- 哈希-Gold Balanced Lineup 分类: POJ 哈希 2015-08-07 09:04 2人阅读 评论(0) 收藏
Gold Balanced Lineup Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 13215 Accepted: 3873 ...
- 1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列
1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列 Time Limit: 5 Sec Memory Limit: 64 MBSubmit: 510 S ...
- 洛谷 P1360 [USACO07MAR]Gold Balanced Lineup G (前缀和+思维)
P1360 [USACO07MAR]Gold Balanced Lineup G (前缀和+思维) 前言 题目链接 本题作为一道Stl练习题来说,还是非常不错的,解决的思维比较巧妙 算是一道不错的题 ...
随机推荐
- jquery 初步学习
首先 jQuery是一个轻量级的 JS框架,核心文件才几十KB 1. jquery 对象 var $variable=jquery对象 var variable = DOM对象 $variable[0 ...
- window.open()总结
今天找父页面和子页面调去问题. 父页面js 1.打开子页面 可以设置子页面长宽高和位置 win= window.open(url, "", "top=45,left=20 ...
- vue(2)创建项目
1.创建项目 cmd到自己指定目录下,执行 vue init webpack-simple hello-vue 2.安装项目依赖 cd hello-vue cnpm install 3.运行该项目,测 ...
- c#之GDI简单实现代码及其实例
作业:文档形式 3到5页理解 1.理解 2.源代码解释(1到2页) 3.实现效果 项目地址: https://github.com/zhiyishou/polyer Demo:https://zhiy ...
- sf04_操作系统中 heap 和 stack 的区别
概述 本文分三部分,描述有所重叠,但可以让你对栈与堆有一个比较清晰.全面的认识 heap 和 stack是什么 堆栈是两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top) ...
- Python APIs
NDArray API Python API速查
- UGUI Image血条或者进度条效果
把图片的Image组件中的image type选成Filled,下面就出现了Fill Amount,通过GetComponent<Image>().fillAmount; 就可以拿到flo ...
- socket编程(一)
因为下载器涉及到socket的知识,就花了一天学习了.因为时间原因分成几部分.(这里记录上的是基于Windows平台的) #include <stdio.h> #include <w ...
- java多线程优先级问题
java 中的线程优先级的范围是1-10,默认的优先级是5.“高优先级线程”会优先于“低优先级线程”执行. 例子: package com.ming.thread.threadpriority; pu ...
- nginx的反向代理功能和负载均衡
使用nginx实现反向代理 Nginx只做请求的转发,后台有多个http服务器提供服务,nginx的功能就是把请求转发给后面的服务器,决定把请求转发给谁. 1安装tomcat 在一个虚拟机上创建两个t ...