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选 ...
随机推荐
- jquery的animate能渐变background-color
在freecodecamp 上学习复习时,写了一个demo,引用了 jquery 实现 color 的渐变动画,然后运行测试的时候,发现其他功能都正常,就是无法是实现颜色的动画. 如: $('butt ...
- RocketMQ学习笔记(12)----RocketMQ的Consumer API简介
由于消息的消费方式有两种,所以两种方式也有不同的API: 1. PushConsumer的配置 1. consumerGroup: 默认值为DEFAULT_CONSUMER,Consumer组名,多个 ...
- 【AnjularJS系列前篇 】 适用场景
AngularJS是一个 MV* 框架,最适于开发客户端的单页面应用.它不是个功能库,而是用来开发动态网页的框架. 它专注于扩展HTML的功能,提供动态数据绑定(data binding),而且它能跟 ...
- CorelDRAW简单绘制的一杯满满的橙汁教程
CorelDRAW怎么画一杯橙汁?方法很简单,首先绘制一个闭合路径,执行线性渐变,填充颜色:复制图形,使用刻刀工具裁剪两半,更改不透明度:然后为橙汁增加底部椭圆:修剪橙子片:绘制吸管:最后加上一层橙子 ...
- 路飞学城Python-Day24(practise)
本章总结 练习题 什么是C/S架构? C指的是client(客户端软件),S指的是Server(服务端软件)
- ansible组件 Ad-Hoc
ad hoc ---临时的,在ansible里需要快速执行,并不用保存命令的执行方式 简单命令 playbook 复杂命令 EXAMPLES: - name: install the late ...
- 洛谷 P1338 末日的传说 (字典序 + 逆序对)
这道题需要对排列有深刻的理解和认识 给出逆序对的个数,求改逆序对个数的字典序最小的排列 那么既然是最小,那么一开始一段肯定是升序,一直到某个数后才开始改变 即1 2 3-- n-1 n a b c d ...
- javaScript将string转换成array,并将汉字按汉语拼音排序方法
亲测,代码如下: var str = '中华人民共和国民主富强': var arr = str.split("");//字符串装换数组方法一 //arr = str.replace ...
- Docker 管理工具的选择:Kubernetes 还是 Swarm?
[编者的话]选择Kubernetes 或者 Swarm 就像在将 Linux 桌面发行版的范围缩小到两个后选出一个最喜欢的.哪个更满足你的需要如何才是决定因素. [3 天烧脑式基于Docker的CI/ ...
- 【翻译自mos文章】怎么正确的计算一个ip地址的subnet id?
怎么正确的计算一个ip地址的subnet id? 来源于: How to calculate the correct subnet for an interface (文档 ID 1059759.1) ...