BZOJ1567 [JSOI2008]Blue Mary的战役地图(二分+二维hash)
题意
问边长为n的两个正方形中最大的相等子正方形。(n<=50)
题解
用到了二维hash,感觉和一维的不太一样。
对于列行有两个不同的进制数然后也是通过类似前缀和的方法差分出一个矩形的hash值
这样可以0(1)的算出一个正方形的hash值。
然后我们二分长度x,每一次遍历整个长度为x的子正方形n2判断即可。
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
using namespace std;
const int mod1=;
const int mod2=;
map<unsigned,int> ma;
unsigned long long pow1[],pow2[],hash1[][],hash2[][];
int n,ans,t;
bool judge(int x){
++t;
for(int i=x;i<=n;i++)
for(int j=x;j<=n;j++){
ma[hash1[i][j]-hash1[i-x][j]*pow2[x]-hash1[i][j-x]*pow1[x]+hash1[i-x][j-x]*pow1[x]*pow2[x]]=t;
}
for(int i=x;i<=n;i++)
for(int j=x;j<=n;j++){
if(ma[hash2[i][j]-hash2[i-x][j]*pow2[x]-hash2[i][j-x]*pow1[x]+hash2[i-x][j-x]*pow1[x]*pow2[x]]==t)return true;
}
return false;
}
int main(){
scanf("%d",&n);
pow1[]=pow2[]=;
for(int i=;i<=n;i++){
pow1[i]=pow1[i-]*mod1;
pow2[i]=pow2[i-]*mod2;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
int a;
scanf("%d",&a);
hash1[i][j]=hash1[i][j-]*mod1+a;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++){
int a;
scanf("%d",&a);
hash2[i][j]=hash2[i][j-]*mod1+a;
}
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
hash1[i][j]=hash1[i-][j]*mod2+hash1[i][j];
for(int i=;i<=n;i++)
for(int j=;j<=n;j++)
hash2[i][j]=hash2[i-][j]*mod2+hash2[i][j];
int l=;int r=n;
while(l<=r){
int mid=(l+r)>>;
if(judge(mid)){
l=mid+;
ans=mid;
}
else r=mid-;
}
printf("%d",ans);
return ;
}
BZOJ1567 [JSOI2008]Blue Mary的战役地图(二分+二维hash)的更多相关文章
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash
1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...
- BZOJ1567 [JSOI2008]Blue Mary的战役地图 二分答案 哈希
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1567 题意概括 给出两个n*n的数字矩阵,问最大公共正方形边长. 题解 先二分答案一个m,对于每一 ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )
二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...
- bzoj1567: [JSOI2008]Blue Mary的战役地图
将矩阵hash.s[0]忘了弄成0,输出中间过程发现了. hash.sort.判重.大概这样子的步骤吧. #include<cstdio> #include<cstring> ...
- B1567 [JSOI2008]Blue Mary的战役地图 二分答案+hash
一开始以为是dp,后来看了一下标签...二分答案?之前也想过,但是没往下想,然后之后的算法就顺理成章,先求出第一个地图的所有子矩阵的hash值,然后求第二个,在上一个地图例二分查找,然后就没了. 算法 ...
- 【矩阵哈希】【二分答案】【哈希表】bzoj1567 [JSOI2008]Blue Mary的战役地图
引用题解:http://hzwer.com/5153.html 当然,二分可以换成哈希表. #include<cstdio> #include<iostream> #inclu ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图
1567: [JSOI2008]Blue Mary的战役地图 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1011 Solved: 578[Sub ...
- [JSOI2008]Blue Mary的战役地图(二分+哈希)
Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提高自己的水平. 由于Blue Mary的技术已经达到了一定的高度,因此,对于用同一种打 ...
- bzoj 1567: [JSOI2008]Blue Mary的战役地图【二分+hash】
二维哈希+二分 说是二维,其实就是先把列hash了,然后再用列的hash值hash行,这样可以O(n)的计算一个正方形的hash值,然后二分边长,枚举左上角点的坐标然后hash判断即可 只要base选 ...
随机推荐
- Jmeter数据库测试
Jmeter安装 Jmeter是纯java程序,所以在安装jmeter之前需要先安装JDK,并配置JDK路径,然后开始安装Jmeter. 进入Jmeter官网(https://jmeter.apach ...
- P3376 【模板】网络最大流(luogu)
P3376 [模板]网络最大流(luogu) 最大流的dinic算法模板(采取了多种优化) 优化 时间 inline+当前弧+炸点+多路增广 174ms no 当前弧 175ms no 炸点 249 ...
- css控制单行或者多行文本超出显示省略号
1.单行文本 使用text-overflow:ellipsis属性 text-overflow: clip|ellipsis|string; clip:修剪文本. ellipsis:显示省略符号来代表 ...
- 安装laravel项目出错
我的本地是7.0.1,而下载下来的原来是运行在7.0.8版本的,于是执行:composer install 时,报了一堆错.解决办法:删掉composer.lock,重新composer instal ...
- [CodeForces]529B Group Photo 2
AK爷GhostCai的电脑又蓝屏了Orz 贪心题,确定一个maxh,限定h不大于一个值.枚举maxh. check的时候的细节很多: 1.h>maxh但w<maxh交换的时候需要占用交换 ...
- echarts如何更改表格主题颜色
vue项目中,需要使用echarts时,需要根据UI设计图进行图标颜色修改 方法一: 1.在script中引入echarts以及主题样式: import echarts from 'echarts'; ...
- Python学习笔记(6)元组
2019-03-02 元组(tuple): (1)元组是不可变的,无法进行任意修改.插入.删除一个元素. (2)创建元组大部分时候用小括号,如果创建的元组中只有一个元素,需要在它的后面加上一个逗号. ...
- 关于fromkeys的用法
分享一个小知识点: 1. Python 中关于dict的fromkeys方法: 1. fromkeys是用于重构字典 2. 至少传一个参数,第一个参数为新建dict的key,如果第一个参数为字典,那么 ...
- tp框架 验证码的应用注意事项
1如何点击更换二维码 二维码是img标签的src访问生成二维码的方法.绑定点击事件,ajax的get方式请求生成二维码的函数.在U函数后面加上任意不重复的参数 如 ?rand=’+math.rand ...
- [terry笔记]学校管理系统
如下是要求: # 角色:学校.学员.课程.讲师# 要求:# 1. 创建北京.上海 2 所学校# 2. 创建linux , python , go 3个课程 , linux\py 在北京开, go 在上 ...