Link:

BZOJ 1567 传送门

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的战役地图的更多相关文章

  1. BZOJ 1567 Blue Mary的战役地图(二维hash+二分)

    题意: 求两个矩形最大公共子正方形.(n<=50) 范围这么小可以枚举子正方形的边长.那么可以对这个矩形进行二维hash,就可以在O(1)的时候求出任意子矩形的hash值.然后判断这些正方形的h ...

  2. BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )

    二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...

  3. BZOJ 1567: [JSOI2008]Blue Mary的战役地图

    1567: [JSOI2008]Blue Mary的战役地图 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1011  Solved: 578[Sub ...

  4. BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash

    1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...

  5. bzoj1567: [JSOI2008]Blue Mary的战役地图

    将矩阵hash.s[0]忘了弄成0,输出中间过程发现了. hash.sort.判重.大概这样子的步骤吧. #include<cstdio> #include<cstring> ...

  6. [JSOI2008] [BZOJ1567] Blue Mary的战役地图 解题报告 (hash)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1567 Description Blue Mary最近迷上了玩Starcraft(星际争霸 ...

  7. [JSOI2008]Blue Mary的战役地图(二分+哈希)

    Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提高自己的水平. 由于Blue Mary的技术已经达到了一定的高度,因此,对于用同一种打 ...

  8. B1567 [JSOI2008]Blue Mary的战役地图 二分答案+hash

    一开始以为是dp,后来看了一下标签...二分答案?之前也想过,但是没往下想,然后之后的算法就顺理成章,先求出第一个地图的所有子矩阵的hash值,然后求第二个,在上一个地图例二分查找,然后就没了. 算法 ...

  9. bzoj 1567: [JSOI2008]Blue Mary的战役地图【二分+hash】

    二维哈希+二分 说是二维,其实就是先把列hash了,然后再用列的hash值hash行,这样可以O(n)的计算一个正方形的hash值,然后二分边长,枚举左上角点的坐标然后hash判断即可 只要base选 ...

随机推荐

  1. Android 图片文字单位 px、dp、sp区别

    文章来源:http://www.cnblogs.com/bjzhanghao/archive/2012/11/06/2757300.html px:像素,一个像素点,1px代表屏幕上一个物理的像素点: ...

  2. 按住ALT键复制

    按住ALT键可以选择一块进行操作. 这个在数据库in查询.代码中批量删除头部一些东西特别方便.

  3. linux下如何修改进程优先级?

    linux下的进程调度优先级是从-20到19,一共40个级别,数字越大,表示进程的优先级越低.默认时候,进程的优先级是0.查看进程优先级有两个办法:ps和top. 改变进程的优先级的方法有两种: 1, ...

  4. InnoDB 存储引擎的线程与内存池

    InnoDB 存储引擎的线程与内存池   InnoDB体系结构如下: 后台线程: 1.后台线程的主要作用是负责刷新内存池中的数据,保证缓冲池中的内存缓存的是最近的数据: 2.另外,将以修改的数据文件刷 ...

  5. hdu 1551 Cable master (二分法)

    Cable master Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  6. 【转】VS常用快捷键

    每次在网上搜关于VS有哪些常用快捷键的时候,出来的永远是一串长的不能再长的列表,完全没体现出“常用”二字,每次看完前面几个就看不下去了,相信大家都 有这种感觉.其实我们平时用的真的只有很少的一部分,借 ...

  7. HDU 4585 Shaolin(Treap找前驱和后继)

    Shaolin Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others) Total Su ...

  8. [洛谷P3857][TJOI2008]彩灯

    题目大意:有$n$盏灯,$m$个开关($n,m\leqslant 50$),每个开关可以控制的灯用一串$OX$串表示,$O$表示可以控制(即按一下,灯的状态改变),$X$表示不可以控制,问有多少种灯的 ...

  9. 湘潭邀请赛 2018 E From Tree to Graph

    题意: 给出一棵树以及m,a,b,x0,y0.之后加m条边{(x1,LCA(x1,y1)),(x2,LCA(x2,y2))...(xm,LCA(xm,ym))}.定义z = f(0)^f(1)^... ...

  10. 汕头市队赛 SRM10 T3 数学上来先打表

    数学上来先打表 SRM 10 描述 给出 n个点(不同点之间有区别),求出满足下列条件的连边(双向边)方案:1.每条边连接两个不同的点,每两个点之间至多有一条边2.不存在三个点a,b,c使三个点间两两 ...