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. Microsxxxxxxx-面试总结

    策略题 There are four kinds of cards, respectively, 1,2, 3,4 numbers. There are seven cards for each ty ...

  2. ASP.NET Core [1]:Hosting(笔记)

    参考:http://www.cnblogs.com/RainingNight/p/hosting-in-asp-net-core.html

  3. ./configure, make, sudo make install 的含义

    一般编译安装会用到. 将压缩包example.tar.gz解压到onePackage下example, 在onePackage下新建install文件夹. 在终端中执行 1) 配置sudo ./con ...

  4. springbootday06 mysql

    一.MySql 1. 数据库概述 数据库( Database )是按照数据结构来组织.存储和管理数据的仓库 . 数据按照特定的格式存储起来,用户可以通过SQL (Structured Query La ...

  5. C 语言 进阶

    清单狂魔,只挖坑不填坑.. 前言 最近经常被询问 C 语言 相关的问题,突然便也觉得需要思考一下 C 语言的进阶了. 我用 C 语言写过的最大的一个项目,也只是那个贪吃蛇,后来就断断续续地用 Pyth ...

  6. 思梦PHP-阿里大鱼手机验证码

    小伙伴是否做PC网站的时候,是否遇到过注册用户需要使用短信验证的功能呢?或者找回密码,以及验证用户的信息等等功能!今天思梦PHP就为大家带来ThinkPHP整合阿里大鱼短信验证的功能! 首先,我们要明 ...

  7. kvm竟然抓不到kvm的tracepoint

    今天终于把kvm给搭起来了,打开了host机的tracepoint竟然一个都没有抓到,这是咋回事? 难道kvm的东西只有在启动的时候才会被抓到? 虚拟出来一块内存一块CPU,虚拟出来一个内存.感觉都好 ...

  8. sqlserver 汉字转拼音 首写字母 索引 函数

    create function fun_getPY(@str nvarchar(4000)) returns nvarchar(4000) as begin declare @word nchar(1 ...

  9. hdu 1172 猜数字

    猜数字 Time Limit: 20000/10000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  10. 【C++ 拾遗】C++'s most vexing parse

    C++'s most vexing parse 是 Scott Meyers 在其名著<Effective STL>中创造的一个术语. Scott 用这个术语来形容 C++ 标准对于 de ...