poj3274
很不错的hash
优化有两个方面:1.根据题目换一个更优化的算法 2.在算法运行过程中优化
这题除了暴力好像没别的办法了吧?
但是暴力也是有策略的!
到第i只牛特征为j的总数为sum[i,j];
找到最大的区间(l,r]使得sum[r,1]-sum[l,1]=sum[r,2]-sum[l,2]…=sum[r,k]-sum[l,k]
整理就得sum[r,1]-sum[r,2]=sum[l,1]-sum[l,2] sum[r,1]-sum[r,3]=sum[r,1]-sum[r,3]……
于是做到每只牛的时候,我们就能得到一个序列。满足条件就是两个序列相等,
怎么快速判断序列:hash!得解!
type link=^node;
node=record
data:longint;
next:link;
end;
const key=;
var hash:array[..] of link;
sum:array[..] of longint;
num:array[..,..] of longint;
ans,n,k,x,j,i,s:longint;
function max(a,b:longint):longint;
begin
if a>b then exit(a) else exit(b);
end; function allsame(x,y:longint):boolean; //注意可能出现hash值相同但序列不同
var i:longint;
begin
allsame:=true;
for i:= to k do
if num[x,i]<>num[y,i] then exit(false);
end; procedure add(x,y:longint);
var p:link;
begin
new(p);
p^.data:=y;
p^.next:=hash[x];
hash[x]:=p;
end; procedure push(x,i:longint);
var p:link;
begin
if hash[x]=nil then add(x,i)
else begin
p:=hash[x];
while p<>nil do
begin
if allsame(p^.data,i) then
begin
ans:=max(ans,i-p^.data); //如果相同,那么当前序列就无需入hash
exit;
end;
p:=p^.next;
end;
add(x,i); //拉链法解决冲突
end;
end; begin
readln(n,k);
add(,);
for i:= to n do
begin
readln(x);
j:=;
while x<> do
begin
j:=j+;
sum[j]:=sum[j]+x mod ;
x:=x shr ;
end;
s:=;
for j:= to k do
begin
num[i,j]:=sum[]-sum[j]; //生成序列
s:=(s+sqr(num[i,j])*j mod key) mod key ; //很奇怪的hash……
end;
push(s,i); //hash值都不同那么序列一定不同
end;
writeln(ans);
end.
判断两个序列是否相同,hash是个好方法!
poj3274的更多相关文章
- POJ3274 hash
POJ3274 问题重述: 已知有n头牛,用一个K位二进制数Ak,Ak-1,...,A1表示一头牛具有的特征,Ai=1表示具有特征i.现给定按顺序排列的N头牛的k位特征值,称某个连续范围内“特征平衡” ...
- POJ-3274 Gold Balanced Lineup---hash经典题!
题目链接: https://vjudge.net/problem/POJ-3274 题目大意: 给定多头牛的属性,每头牛的属性由一个非负数表示,该数的二进制表示不会超过K位,它的二进制表示的每一位若为 ...
- [poj3274]排排站(Hash)
题目:http://poj.org/problem?id=3274 题目大意:http://www.wikioi.com/problem/1247/ (此题中文版) 分析: 令sum[i][j]表示a ...
- poj3274 哈希
这题终于让我AC了,其过程之艰辛我不想再回忆了,看了各种代码,一定要注意指针空和非空的问题,再一个要注意边界. #include <stdio.h> #include <string ...
- poj3274 Gold Balanced Lineup(HASH)
Description Farmer John's N cows (1 ≤ N ≤ 100,000) share many similarities. In fact, FJ has been abl ...
- poj3274 找平衡数列(哈希加一点数学思维)
题目传送门 题目大意:有n只牛,每只牛有k个属性,接下来n个数字,每个数字的二进制位上的1和0分别表示某种属性的有或者无,然后一个特殊数列就是,一个区间内所有牛的各种属性的总和相等(有e种1属性 e ...
- poj题目
poj2965 poj1753:标准的BFS+位运算优化 poj1328:线段覆盖变种,把圆对应到线段上,贪心求解 poj2109:高精度开根,二分+高精度,注意要判断答案的位数,如果按照题目给的范围 ...
- poj分类 很好很有层次感。
初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ( ...
- 【转】POJ题目分类推荐 (很好很有层次感)
OJ上的一些水题(可用来练手和增加自信) (poj3299,poj2159,poj2739,poj1083,poj2262,poj1503,poj3006,poj2255,poj3094)初期: 一. ...
随机推荐
- uniquery 配合 mssql 自带存储过程实现分页
--使用系统存储过程实现的通用分页存储过程 -- 此过程原作者,应该是:邹健老前辈 CREATE PROC sp_PageView @sql ntext, --要执行的sql语句 , --要显示的页码 ...
- dapper.rainbow
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- 解决java.io.IOException: Cannot run program "cygpath": CreateProcess error=2, 系统找不到指定的文件 的错误
一.外部环境: 系统环境:Windows 8 磁盘分区:只有C盘 开发环境:IntelliJ IDEA Community Edition 2016.1.3(64) 执行代码:rdd.saveAsTe ...
- Linux各发行版本 优缺点 简介
2008.01.21 13:43 Linux最早由Linus Benedict Torvalds在1991年开始编写.在这之前,RichardStallman创建了Free SoftwareFound ...
- API删除文件
using System; using System.Runtime.InteropServices; namespace ConsoleApplication1 { class Program { ...
- java之StringBuffer
StringBuffer就是字符串缓冲区,用于存储数据的容器. 特点:长度可变,可存储不同类型的数据,最终转化成字符串使用,可以对字符串修改 功能: 添加:append(value), insert( ...
- Web服务器集群搭建关键步骤纪要
前言:本文记述了搭建一个小型web服务器集群的过程,由于篇幅所限,系统.软件的安装和基本配置我这里就省略了,只记叙关键配置和脚本内容.假如各位朋友想了解各软件详细配置建议查阅官方文档. 一 需求分析: ...
- Android UI学习前言:Android UI系统的知识结构
Android UI系统的知识结构如下图所示: 对于 一个GUI系统地使用,首先是由应用程序来控制屏幕上元素的外观和行为,这在各个GUI系统中是不相同的,但是也具有相通性.Android系统在这方面, ...
- 四、mysql内置函数
.字符串函数 concat('a','b'); 字符串拼接函数 ,,"我是A我是B"): 从指定位置开始替换指定长度的指定数据(起步为1) lower() 转小写 upper() ...
- #pragma预处理指令讲解
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...