[BZOJ 1567] Blue Mary的战役地图
Link:
Solution:
矩阵Hash/二维$Hash$模板题
涉及到需要快速查询、匹配的题目,考虑直接上$Hash$
矩阵$Hash$其实就是每行先各$Hash$一次,对于$x~x+l-1$行取出$y~y+l-1$列的$Hash$值再进行一次$Hash$即可
取出$l~r$的$Hash$值的方法:$Hash[j]-Hash[i-1]*base^{j-i+1}$
注意横竖两次$Hash$乘数要不同!否则碰撞概率极高
Tip: 判断一个数是否在有序序列中的方式:$*lower\_ bound(begin,end,now)==now$
Code:
#include <bits/stdc++.h> using namespace std;
typedef unsigned long long ull;
const int MAXN=;
const ull hsn1=,hsn2=;
int n,dat[][MAXN][MAXN];
ull pre[MAXN],hs[][MAXN][MAXN],t[MAXN*MAXN]; ull cal(int k,int x,int y,int l)
{
ull ret=;
for(int i=x;i<=x+l-;i++)
ret=ret*hsn2+hs[k][i][y+l-]-hs[k][i][y-]*pre[l];
return ret;
} bool check(int x)
{
int cnt=;
for(int i=;i<=n-x+;i++) for(int j=;j<=n-x+;j++)
t[++cnt]=cal(,i,j,x);
sort(t+,t+cnt+);
for(int i=;i<=n-x+;i++) for(int j=;j<=n-x+;j++)
{
ull cur=cal(,i,j,x);
if(*lower_bound(t+,t+cnt+,cur)==cur)
return true;
}
return false;
} int main()
{
scanf("%d",&n);
for (int k=;k<;k++) for(int i=;i<=n;i++) for(int j=;j<=n;j++)
scanf("%d",&dat[k][i][j]);
for(int k=;k<;k++)
for(int i=;i<=n;i++)
{
hs[k][i][]=;
for(int j=;j<=n;j++)
hs[k][i][j]=hs[k][i][j-]*hsn1+dat[k][i][j];
} pre[]=;for(int i=;i<=;i++) pre[i]=pre[i-]*hsn1;
int l=,r=n;
while(l<=r)
{
int mid=(l+r)>>;
if(check(mid)) l=mid+;
else r=mid-;
}
printf("%d",r);
return ;
}
[BZOJ 1567] Blue Mary的战役地图的更多相关文章
- BZOJ 1567 Blue Mary的战役地图(二维hash+二分)
题意: 求两个矩形最大公共子正方形.(n<=50) 范围这么小可以枚举子正方形的边长.那么可以对这个矩形进行二维hash,就可以在O(1)的时候求出任意子矩形的hash值.然后判断这些正方形的h ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )
二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图
1567: [JSOI2008]Blue Mary的战役地图 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1011 Solved: 578[Sub ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash
1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...
- bzoj1567: [JSOI2008]Blue Mary的战役地图
将矩阵hash.s[0]忘了弄成0,输出中间过程发现了. hash.sort.判重.大概这样子的步骤吧. #include<cstdio> #include<cstring> ...
- [JSOI2008] [BZOJ1567] Blue Mary的战役地图 解题报告 (hash)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1567 Description Blue Mary最近迷上了玩Starcraft(星际争霸 ...
- [JSOI2008]Blue Mary的战役地图(二分+哈希)
Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提高自己的水平. 由于Blue Mary的技术已经达到了一定的高度,因此,对于用同一种打 ...
- B1567 [JSOI2008]Blue Mary的战役地图 二分答案+hash
一开始以为是dp,后来看了一下标签...二分答案?之前也想过,但是没往下想,然后之后的算法就顺理成章,先求出第一个地图的所有子矩阵的hash值,然后求第二个,在上一个地图例二分查找,然后就没了. 算法 ...
- bzoj 1567: [JSOI2008]Blue Mary的战役地图【二分+hash】
二维哈希+二分 说是二维,其实就是先把列hash了,然后再用列的hash值hash行,这样可以O(n)的计算一个正方形的hash值,然后二分边长,枚举左上角点的坐标然后hash判断即可 只要base选 ...
随机推荐
- Python处理Sqlite3数据库
sqlite3比较小众 本章主要通过Python Code表述如何增.查.改.删 sqlite3 DB 一.直接上代码 #!/usr/bin/env python # -*- coding: utf- ...
- 重现ssd遇到的问题
首先是create_list.sh和create_data.sh中的data_dir的路径得修改. 然后是在create_data.sh文件调用$caffe_root下的scripts目录中的crea ...
- MySQL事物相关学习
总结下最近对MySQL数据库的认识 Q:在手动开启事物后,commit失败是否需要显示的rollback? A:在网上查了不少资料,没有查到明确的答案.问了身边的朋友,朋友也不太了解,不过均表示显示的 ...
- Android Service完全解析
Service的基本用法 1.新建一个Android项目,新建一个MyService继承自Service,并重写父类的onCreate(),onStartCommand()方法和onDestory() ...
- python3.6操作mysql
1.通过 pip 安装 pymysql 进入 cmd 输入 pip install pymysql 回车等待安装完成: 安装完成后出现如图相关信息,表示安装成功. 2.测试连接 import ...
- SQL 唯一标识 写法
创建唯一标识的方法~16位唯一标识 SELECT LTRIM(STR(CONVERT(varchar(100), GETDATE(), 112)))+right(cast(power(10,6) as ...
- [洛谷P1972][SDOI2009]HH的项链
题目大意:给你一串数字,多次询问区间内数字的种类数 题解:莫队 卡点:洛谷数据加强,开了个$O(2)$ C++ Code: #include <cstdio> #include <a ...
- 交叉编译HTOP并移植到ARM嵌入式Linux系统
原创作品,允许转载,转载时请务必以超链接形式标明文章.作者信息和本声明,否则将追究法律责任. 最近一直在完善基于Busybox做的ARM Linux的根文件系统,由于busybox是一个精简的指令集组 ...
- eclipse安装使用jetty
安装: 直接从eclipse中的eclipse_market中下载即可,关键说下配置项目的访问路径:
- java中截取字符串的方式
1.length() 字符串的长度 例:char chars[]={'a','b'.'c'}; String s=new String(chars); int len=s.length(); 2.ch ...