【矩阵哈希】【二分答案】【哈希表】bzoj1567 [JSOI2008]Blue Mary的战役地图
引用题解:http://hzwer.com/5153.html
当然,二分可以换成哈希表。
#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
#define MOD 2501
typedef unsigned long long ull;
const ull seed1=3659,seed2=1789;
ull sum[51][51],sum2[51][51],v[MOD],pow1[51],pow2[51];
int n,ans,first[MOD],next[MOD],en;
void Insert(const ull &V)
{
int U=(int)(V%MOD);
v[en]=V;
next[en]=first[U];
first[U]=en++;
}
bool check(const int &x)
{
memset(first,-1,sizeof(first)); en=0;
for(int i=x;i<=n;i++)
for(int j=x;j<=n;j++)
Insert(sum[i][j]
-sum[i-x][j]*pow1[x]
-sum[i][j-x]*pow2[x]
+sum[i-x][j-x]*pow1[x]*pow2[x]);
for(int i=x;i<=n;i++)
for(int j=x;j<=n;j++)
{
ull t=sum2[i][j]
-sum2[i-x][j]*pow1[x]
-sum2[i][j-x]*pow2[x]
+sum2[i-x][j-x]*pow1[x]*pow2[x];
int o=(int)(t%MOD);
for(int i=first[o];i!=-1;i=next[i])
if(t==v[i])
return 1;
}
return 0;
}
int main()
{
scanf("%d",&n);
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)
cin>>sum[i][j];
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)
cin>>sum2[i][j];
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)
sum[i][j]+=sum[i-1][j]*seed1;
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)
sum[i][j]+=sum[i][j-1]*seed2;
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)
sum2[i][j]+=sum2[i-1][j]*seed1;
for(int i=1;i<=n;++i)for(int j=1;j<=n;++j)
sum2[i][j]+=sum2[i][j-1]*seed2;
pow1[0]=pow2[0]=1;
for(int i=1;i<=n;i++)
pow1[i]=pow1[i-1]*seed1,
pow2[i]=pow2[i-1]*seed2;
int l=1,r=n;
while(l<=r)
{
int mid=l+r>>1;
if(check(mid))
ans=mid,l=mid+1;
else r=mid-1;
}
printf("%d\n",ans);
return 0;
}
【矩阵哈希】【二分答案】【哈希表】bzoj1567 [JSOI2008]Blue Mary的战役地图的更多相关文章
- BZOJ1567 [JSOI2008]Blue Mary的战役地图 二分答案 哈希
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1567 题意概括 给出两个n*n的数字矩阵,问最大公共正方形边长. 题解 先二分答案一个m,对于每一 ...
- BZOJ1567 [JSOI2008]Blue Mary的战役地图(二分+二维hash)
题意 问边长为n的两个正方形中最大的相等子正方形.(n<=50) 题解 用到了二维hash,感觉和一维的不太一样. 对于列行有两个不同的进制数然后也是通过类似前缀和的方法差分出一个矩形的hash ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )
二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash
1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...
- [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选 ...
- Luogu P4398 [JSOI2008]Blue Mary的战役地图 矩阵哈希
其实可以二分矩阵边长但是我太懒了$qwq$. 把每个子矩阵扔到$map$里,然后就没了 #include<cstdio> #include<map> #include<i ...
- BZOJ 1567 Blue Mary的战役地图(二维hash+二分)
题意: 求两个矩形最大公共子正方形.(n<=50) 范围这么小可以枚举子正方形的边长.那么可以对这个矩形进行二维hash,就可以在O(1)的时候求出任意子矩形的hash值.然后判断这些正方形的h ...
随机推荐
- Codeforces Round #532 (Div. 2) 题解
Codeforces Round #532 (Div. 2) 题目总链接:https://codeforces.com/contest/1100 A. Roman and Browser 题意: 给出 ...
- SICAU-OJ: A|B
A|B 题意: 给出一个整数n(1<=n<=10100),求Σd(d满足d可以整除n),同时保证不存在x^2有x^2可以整除n. 另外,n的质因子满足小于等于1000. 题解: 这题是我第 ...
- bzoj1503: [NOI2004]郁闷的出纳员 fhqtreap版
这道题写法和之前差不多 但是fhqtreap在加点的时候为了同时维护大根堆以及二叉排序树的性质所以插入时也要注意分裂 fhqteap需要判断指针是否为空 不然就会re 这个我调了很久 #include ...
- SpringMvc基础知识(二) springmvc和mybatis整合
1 springmvc和mybatis整合 1.1 需求 使用springmvc和mybatis完成商品列表查询. 1.2 整合思路 springmvc+mybaits的系统架构: 第一步:整合dao ...
- 【转】Linux Futex的设计与实现
引子在编译2.6内核的时候,你会在编译选项中看到[*] Enable futex support这一项,上网查,有的资料会告诉你"不选这个内核不一定能正确的运行使用glibc的程序" ...
- locust===Writing a locustfile
The Locust class A locust class represents one user (or a swarming locust if you will). Locust will ...
- HTTP===通用首部字段的各种指令解释
Cache-Control 通过指定首部字段 Cache-Control 的指令,就能操作缓存的工作机制. 指令的参数是可选的,多个指令之间通过“,”分隔.首部字段 Cache-Control 的指令 ...
- 白话TCP三次握手
在TCP/IP协议中,TCP协议提供可靠的连接服务,采用三次握手建立一个连接. 第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SEND状态,等待服务器确认: 第二次握 ...
- c++文件流写入到execl中
#include <iostream> #include <fstream> #include <string> using namespace std; int ...
- xcode/Interface Build(IB)/iPhone模拟器/mac/组合键常用的命令集
1.Xcode常用快捷键: win+N:新建文件 win+shift+N:新建工程 win+O:打开工程或文件 win+S:保存 win+shift+S:另存为 win+Z:撤销一步 win+W:关闭 ...