[JSOI2008]Blue Mary的战役地图(二分+哈希)
Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏。她正在设法寻找更多的战役地图以进一步提高自己的水平。
由于Blue Mary的技术已经达到了一定的高度,因此,对于用同一种打法能够通过的战役地图,她只需要玩一张,她就能了解这一类战役的打法,然后她就没有兴趣再玩儿这一类地图了。而网上流传的地图有很多都是属于同一种打法,因此Blue Mary需要你写一个程序,来帮助她判断哪些地图是属于同一类的。
具体来说,Blue Mary已经将战役地图编码为n*n的矩阵,矩阵的每个格子里面是一个32位(有符号)正整数。对于两个矩阵,他们的相似程度定义为他们的最大公共正方形矩阵的边长。两个矩阵的相似程度越大,这两张战役地图就越有可能是属于同一类的。
Solution
这题的数据范围是允许我们n^4log(n)做的,大概就是二分一个答案,暴力枚举两个矩形的左上角。
但我们必须做到O(1)查询,所以需要预处理。
我们先设g[i][j][k]表示从第i行第j列,从这个格子往后K个格子的哈希值。
在用一个f[i][j][k]表示以i,j开头的边长为k的正方形的哈希值。
实现的话看代码就好了。
Code
#include<iostream>
#include<cstdio>
#define N 52
using namespace std;
typedef unsigned long long ll;
int n,ans;
ll HA[N][N][N],HB[N][N][N],ha[N][N][N],hb[N][N][N],a[N][N],b[N][N];
const ll base=;
ll power(ll x,ll y){
ll ans=;
while(y){
if(y&)ans*=x;
x*=x;
y>>=;
}
return ans;
}
inline bool check(int pos){
for(int i=;i<=n-pos+;++i)
for(int j=;j<=n-pos+;++j)
for(int k=;k<=n-pos+;++k)
for(int l=;l<=n-pos+;++l)
if(HA[i][j][pos]==HB[k][l][pos])return true;
return false;
}
int main(){
scanf("%d",&n);
for(int i=;i<=n;++i)for(int j=;j<=n;++j)scanf("%ull",&a[i][j]);
for(int i=;i<=n;++i)for(int j=;j<=n;++j)scanf("%ull",&b[i][j]);
for(int k=;k<=n;++k)
for(int i=;i<=n;++i)
for(int j=;j<=n-k+;++j){
ha[i][j][k]=a[i][j];hb[i][j][k]=b[i][j];
for(int l=j+;l<j+k;++l)
ha[i][j][k]=ha[i][j][k]*base+a[i][l],
hb[i][j][k]=hb[i][j][k]*base+b[i][l];
}
for(int k=;k<=n;++k){
ll bas=power(base,k);
for(int i=;i<=n-k+;++i)
for(int j=;j<=n-k+;++j){
HA[i][j][k]=ha[i][j][k];HB[i][j][k]=hb[i][j][k];
for(int l=i+;l<i+k;++l)
HA[i][j][k]=HA[i][j][k]*bas+ha[l][j][k],
HB[i][j][k]=HB[i][j][k]*bas+hb[l][j][k];
}
}
int l=,r=n;
while(l<=r){
int mid=(l+r)>>;
if(check(mid)){
ans=mid;
l=mid+;
}
else r=mid-;
}
cout<<ans;
return ;
}
[JSOI2008]Blue Mary的战役地图(二分+哈希)的更多相关文章
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图( 二分答案 + hash )
二分答案, 然后用哈希去判断... ------------------------------------------------------------------------- #include ...
- B1567 [JSOI2008]Blue Mary的战役地图 二分答案+hash
一开始以为是dp,后来看了一下标签...二分答案?之前也想过,但是没往下想,然后之后的算法就顺理成章,先求出第一个地图的所有子矩阵的hash值,然后求第二个,在上一个地图例二分查找,然后就没了. 算法 ...
- BZOJ1567 [JSOI2008]Blue Mary的战役地图 二分答案 哈希
欢迎访问~原文出处——博客园-zhouzhendong 去博客园看该题解 题目传送门 - BZOJ1567 题意概括 给出两个n*n的数字矩阵,问最大公共正方形边长. 题解 先二分答案一个m,对于每一 ...
- Luogu P4398 [JSOI2008]Blue Mary的战役地图 矩阵哈希
其实可以二分矩阵边长但是我太懒了$qwq$. 把每个子矩阵扔到$map$里,然后就没了 #include<cstdio> #include<map> #include<i ...
- bzoj1567: [JSOI2008]Blue Mary的战役地图
将矩阵hash.s[0]忘了弄成0,输出中间过程发现了. hash.sort.判重.大概这样子的步骤吧. #include<cstdio> #include<cstring> ...
- 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的战役地图
引用题解:http://hzwer.com/5153.html 当然,二分可以换成哈希表. #include<cstdio> #include<iostream> #inclu ...
- bzoj 1567: [JSOI2008]Blue Mary的战役地图【二分+hash】
二维哈希+二分 说是二维,其实就是先把列hash了,然后再用列的hash值hash行,这样可以O(n)的计算一个正方形的hash值,然后二分边长,枚举左上角点的坐标然后hash判断即可 只要base选 ...
随机推荐
- MySQL 性能调优之存储引擎
原文:http://bbs.landingbj.com/t-0-246222-1.html http://bbs.landingbj.com/t-0-245851-1.html MySQ ...
- node exprss-session 和connect-mongo
let express = require('express'); let session = require('express-session'); let app = new express(); ...
- SQLServer数据库分页
以 项目表 PM_Project 为例. PM_Project 全部内容如下(共6条数据): 一.Top – Not In - Top 方式分页 直接的,原始的,不采用函数,纯手动挡. 分步探索过 ...
- JSON for-in 遍历
(代码均以js代码示例) 1.可以使用 for-in 来循环对象的属性,使用中括号([])来访问属性的值: 这中方法便于一些在不确定有属性的情况下使用. var myObj = { "nam ...
- opencv2\flann\matrix.h(69): error C2059: 语法错误:“,”
在提示错误的matrix.h头文件中,修改一下,在free前加上_ ,即FLANN_DEPRECATED void _free() .
- JS --- 如何获取一个对象的类型
可以清楚的看到 拿到数字 字符串 对象 函数 数组 通过.slice(8,-1) 可以拿到类型的名称 ,可以做你想要的操作 Object.prototype.toString.call(222) & ...
- springmvc配置文件
1 springMVC的配置文件路径问题 https://www.cnblogs.com/ysloong/p/6071450.html
- PLA-1
PLA(Principal Component Analysis)主成分分析: 思路1:坐标旋转 1.数据分布以及投影: 2.特征值以及特征向量 思路2: 未完待续...
- 在文件保存中 os.getcwd() os.listdir() os.makedirs() os.mkdir() xx.join() ... 等函数 的使用介绍
path = 'C:\\Users\\zhangjunming\\Desktop\\PycharmProjects\\my_mgm' 1.xx.join(obj) 以xx为分隔符 对obj中的元素 ...
- 学习 Spring (六) 自动装配
Spring入门篇 学习笔记 No: (默认)不做任何操作 byName: 根据属性名自动装配.此选项将检查容器并根据名字查找与属性完全一致的 bean,并将其与属性自动装配 byType: 如果容器 ...