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选 ...
随机推荐
- epoll的边缘触发与水平触发
epoll的边缘触发与水平触发 Tcp连接是双向的,内核为每个socket维护两个缓冲区,读缓冲区与写缓冲区,内核会一个关注这两个缓冲区,当采用水平触发时,对于写缓冲区而言,如果有多余空间可写,对于读 ...
- 【XSY2892】【GDSOI2018】谁是冠军
题目来源:noi2018模拟测试赛(二十三)T3 san 为什么noi模拟赛里会做到省选原题啊…… 题意: Description 有n个人,简单起见把他们编号为1到n,每个人有三项指标分别是攻击力, ...
- 使用 Jersey 和 Apache Tomcat 构建 RESTful Web 服务
作者: Yi Ming Huang, 软件工程师, IBM Dong Fei Wu, 软件工程师, IBM Qing Guo, 软件工程师, IBM 出处: http://www.ibm.com/de ...
- [USACO17JAN] Subsequence Reversal序列反转 (dfs+记忆化)
题目大意:给你一个序列,你可以翻转任意一段子序列一次,求最长不下降子序列长度 tips:子序列可以不连续,但不能破坏在原序列中的顺序 观察数据范围,n<=50,很小,考虑dfs *dfs来跑区间 ...
- React和Vue中,是如何监听变量变化的
React 中事件监听 本地调试React代码的方法 先将React代码下载到本地,进入项目文件夹后yarn build 利用create-react-app创建一个自己的项目 把react源码和自己 ...
- 使用展开操符作替代 .apply() (prefer-spread)
在ES2015以前,你必须使用Function.prototype.apply()来调用可变函数. var args = [1, 2, 3, 4]; Math.max.apply(Math, args ...
- 高级函数-sign
==========sign函数介绍(补充)=========== sign(n):判断n>0返回1;n=0返回0;n<0返回-1. select sign(10),sign(0) ...
- nutch如何修改regex-urlfilter.txt爬取符合条件的链接
例如我在爬取学生在线的时候,发现爬取不到特定的通知,例如<中粮福临门助学基金申请公告>,通过分析发现原来通知的链接被过滤掉了,下面对过滤url的配置文件regex-urlfilter.tx ...
- cogs 466. [NOIP2009] 细胞分裂
466. [NOIP2009] 细胞分裂 ★★ 输入文件:cell.in 输出文件:cell.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] Hanks ...
- java语言MySQL批处理
本质来讲就是使用Statement和PreStatement的addBatch()方法 代码 import java.sql.*; public class GetConnection{ public ...