[JSOI2008]Blue Mary的战役地图 Hash题解
发布日期:2021-05-07 12:10:51 浏览次数:6 分类:原创文章

本文共 2467 字,大约阅读时间需要 8 分钟。

题目描述

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个正整数,表示第二张战役地图的代表矩阵。

输出格式

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

样例

输入

31 2 34 5 67 8 95 6 78 9 12 3 4

输出

2

数据范围与提示

n ≤ 50 n \leq 50 n50

分析

读完题,不难想到 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 longusing 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;}
上一篇:明辨是非 并查集题解
下一篇:「NOI2015」程序自动分析 并查集题解

发表评论

最新留言

初次前来,多多关照!
[***.217.46.12]2025年03月18日 14时18分27秒

关于作者

    喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!

推荐文章

MySQL的基本体系和架构介绍 2019-03-04
MySQL数据备份实践和整理 2019-03-04
结构型设计在工作中的一些经验总结 2019-03-04
EDA设计——在 ISE 软件中 使用 VHDL 语言实现 FIFO 存储器 2019-03-04
如何提升员工体验 助力企业业务增长?这个棘手的问题终于被解决了! 2019-03-04
腾讯物联网操作系统正式开源,最小体积仅1.8 KB 2019-03-04
不懂数据库的码农不是好程序员! 2019-03-04
全球首个!阿里云开源批流一体机器学习平台Alink…… 2019-03-04
必须要看的网上冲浪安全攻略! 2019-03-04
清华硕士爆料:这些才是机器学习必备的数学基础 2019-03-04
红点中国、红杉中国联合领投,WakeData惟客数据完成1000万美元B轮融资 2019-03-04
看完这篇操作系统,和面试官扯皮就没问题了! 2019-03-04
OpenStack发布Ussuri版本 实现智能开源基础设施的自动化 2019-03-04
整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划 2019-03-04
2020 AI 产业图谱启动,勾勒中国 AI 技术与行业生态 2019-03-04
“编程能力差,90%输在了数学上!”CTO:多数程序员都是瞎努力! 2019-03-04
霍因科技获首届全国信创产业生态创新奖 2019-03-04
我是程序员,我用这种方式铭记历史 2019-03-04
F5打造“感知可控,随需而变的应用” 助力企业实现非凡数字体验 2019-03-04
CSDN湘苗培优|保持热情,告别平庸 2019-03-04