题目描述

Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏。她正在设法寻找更多的战役地图以进一步提高自己的水平。

由于Blue Mary的技术已经达到了一定的高度,因此,对于用同一种打法能够通过的战役地图,她只需要玩一张,她就能了解这一类战役的打法,然后她就没有兴趣再玩儿这一类地图了。而网上流传的地图有很多都是属于同一种打法,因此Blue Mary需要你写一个程序,来帮助她判断哪些地图是属于同一类的。

具体来说,Blue Mary已经将战役地图编码为 n × n n \times n n×n的矩阵,矩阵的每个格子里面是一个 32 32 32位(有符号)正整数。对于两个矩阵,他们的相似程度定义为他们的最大公共正方形矩阵的边长。两个矩阵的相似程度越大,这两张战役地图就越有可能是属于同一类的。

输入格式

第一行包含一个正整数 n n n。
以下 n n n行,每行包含 n n n个正整数,表示第一张战役地图的代表矩阵。
再以下 n n n行,每行包含 n n n个正整数,表示第二张战役地图的代表矩阵。

输出格式

仅包含一行。这一行仅有一个正整数,表示这两个矩阵的相似程度。

样例

输入

3
1 2 3
4 5 6
7 8 9
5 6 7
8 9 1
2 3 4

输出

2

数据范围与提示

n ≤ 50 n \leq 50 n≤50。

分析

读完题,不难想到 O ( n 7 ) O(n^7) O(n7)的暴力解法。(枚举正方形长度 O ( n ) O(n) O(n) × \times ×枚举正方形一左上顶点 O ( n 2 ) O(n^2) O(n2) × \times ×枚举正方形二左上顶点 O ( n 2 ) O(n^2) O(n2) × \times ×判断是否相等 O ( n 2 ) O(n^2) O(n2))这样肯定会 T L E TLE TLE。
不妨使用 H a s h Hash Hash,用 O ( 1 ) O(1) O(1)的时间复杂度判断两正方形是否相等。可正方形的 H a s h Hash Hash函数怎么设计呢?其实有很多种方法。 e . g . e.g. e.g.使用无符号长整形(自然溢出),对于每一个数 x x x,计算 s u m = s u m × 131 + x sum=sum\times131+x sum=sum×131+x。最后 s u m sum sum即为整个正方形的 H a s h Hash Hash值。时间复杂度: O ( n 5 ) O(n^5) O(n5)

代码

#include <cstdio>
#include <algorithm>
#include <cmath>
#include <climits>
#include <cstring>
#define uLL unsigned long long
using namespace std;
const int MAXN = 55;
int n, a[MAXN][MAXN], b[MAXN][MAXN], ans;
uLL Hash[MAXN][MAXN][MAXN], Hash_[MAXN][MAXN][MAXN];//Hash[k][i][j](Hash_[k][i][j])表示左上角为(i, j),边长为k的正方形的Hash值
void Map_() {//初始化Hash值uLL sum, sum_;for(int i = 1; i <= n; i ++) {//长度for(int j = 1; j <= (n - i + 1); j ++) {for(int k = 1; k <= (n - i + 1); k ++) {//正方形一左上角sum = 0; sum_ = 0;for(int l = j; l <= (j + i - 1); l ++) {for(int m = k; m <= (k + i - 1); m ++) {//正方形二左上角sum = sum * 131 + a[l][m];sum_ = sum_ * 131 + b[l][m];}}Hash[i][j][k] = sum;Hash_[i][j][k] = sum_;}}}return;
}
int Find_Ans() {//暴力枚举for(int i = n; i >= 1; i --) {//从大到小(找到可行的就可以退出)for(int j = 1; j <= (n - i + 1); j ++) {for(int k = 1; k <= (n - i + 1); k ++) {for(int l = 1; l <= (n - i + 1); l ++) {for(int m = 1; m <= (n - i + 1); m ++) {if(Hash[i][j][k] == Hash_[i][l][m]) return i;}}}}}return 0;
}
int main() {scanf("%d", &n);for(int i = 1; i <= n; i ++) {for(int j = 1; j <= n; j ++) {scanf("%d", &a[i][j]);}}for(int i = 1; i <= n; i ++) {for(int j = 1; j <= n; j ++) {scanf("%d", &b[i][j]);}}Map_();ans = Find_Ans();printf("%d", ans);return 0;
}

[JSOI2008]Blue Mary的战役地图 Hash题解相关推荐

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

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

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

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

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

    二次联通门 : BZOJ 1567: [JSOI2008]Blue Mary的战役地图 /*BZOJ 1567: [JSOI2008]Blue Mary的战役地图社会我栋哥人怂P话多暴力能A题正解能W ...

  4. bzoj 1567: [JSOI2008]Blue Mary的战役地图 二维哈希

    1567: [JSOI2008]Blue Mary的战役地图 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 1199  Solved: 702 [S ...

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

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

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

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

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

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

  8. BZOJ1567 [JSOI2008]Blue Mary的战役地图(二分+二维hash)

    题意 问边长为n的两个正方形中最大的相等子正方形.(n<=50) 题解 用到了二维hash,感觉和一维的不太一样. 对于列行有两个不同的进制数然后也是通过类似前缀和的方法差分出一个矩形的hash ...

  9. [BZOJ1567][JSOI2008]Blue Mary的战役地图(二分+矩阵hash)

    题目描述 传送门 题解 二分答案之后 O(n2) O(n^2)矩阵hash 就是个裸题 代码 #include<algorithm> #include<iostream> #i ...

最新文章

  1. 快被系统性能逼疯了?你需要这份性能优化策略
  2. JQuery.Ajax()的data参数传递方式
  3. linux postfix 搭建,linux 下搭建postfix服务器
  4. 1张手稿图讲明白 Kubernetes 是怎么运行的
  5. 压缩等级_魔兽世界:9.0会落实等级压缩吗,简单分析一下压缩等级的好处
  6. 全向轮移动机器人构型分析
  7. echarts 按需引入模_【React】react项目引入echarts插件
  8. Caffe学习:pycaffe利用caffemodel进行分类(2)
  9. kafka消费者报错:Consider using the new consumer by passing [bootstrap-server] instead of [zookeeper].
  10. 遥远记忆中的美好时光
  11. abap 在屏幕如何调用选择屏幕以及如何获得选择屏幕的操作
  12. 力扣的组合总和解法 (Python)
  13. 深入探索C++对象模型之C++对象(vs,gcc,clang测试)
  14. 我是这样克服拖延症的
  15. CodeBlocks+wxWidgets
  16. git push 卡住不动的解决
  17. 《带你学C带你飞》—— SE44传递结构体变量和结构体指针
  18. Actipro WPF Controls 2022.1.2
  19. 暑期实习生的10个观点
  20. Ubuntu 下 Janus Server 搭建笔记

热门文章

  1. 逆变器控制保护机制ASC和FW
  2. 浏览器缩小 css布局乱了ok
  3. 最高境界,世上无人能及
  4. 读《理想国》——柏拉图
  5. uniapp微信小程序设置背景渐变
  6. 前端gojs各属性使用示例
  7. C++ 类(构造函数的成员初始化列表)
  8. 如何设计一个亿级消息量的 IM 系统
  9. 新博android毕业前
  10. 一般数组的遍历,声明