高高的烦恼题解

这是一道私人的题目。。。
但也很有参考价值。。。
链接:https://www.luogu.com.cn/problem/U161752

题目背景
高约翰对自己的体重一直很烦恼,于是他对自己在学校搬饭的父亲提出了减轻饭量,但他不想让同学或老师误会,他也不想让他们知道他父亲是位厨师,所以他不想让父亲直接将减过的饭直接递给他,于是他父亲替他想出了一种办法。

题目描述
由于高约翰并不聪明,他父亲也并不想让他每天趴在饭箱子上找,厨师疑心这样整个班级的饭都会栽到他儿子身上。于是他告诉他儿子饭箱子里有一个由饭盒组成的正方形,这个正方形中有些饭盒上是透明盖子,有些是白色盖子。如果这个正方形旋转180度,翻转后盖子的颜色和原来在该位置的盖子的颜色相同,这个正方形的右上方的顶点就是高师傅特质的盒饭。如果不只有一个正方形,那答案就是最大的那个正方形。但是鉴于约翰每天都得坐在饭盒边翻上一两个小时,他似乎并不享受这个过程,同学也对他有很大意见。所以请你帮他设计一个程序,让他摆脱这种煎熬吧。

输入格式
第一行输入饭盒的大小,即N行M列。 之后N行,每行M个字母,“W”或“T”(“W”表示白色,“T”表示透明)

输出格式
输出一个正整数,即高师傅特质盒饭的所在的矩阵的边长。如果高师傅不小心忘了布置,那么意味着高约翰最多就得尝完所有的盒饭,那就太悲哀了,请输出-1。

输入输出样例

说明/提示
10%的数据的答案是-1,30%数据0<=N, M<=100; 30%数据101<=N,M<=200;40%数据201<=N,M<=300。PS:感谢提供故事的高**同学。

一个简单的思路:枚举每个正方形,然后判断这个正方形是否旋转对称。然而,单单是枚举每个正方形就已经有n^3的复杂度了,显然行不通。一维哈希就是,对于一个序列
我们给每一个序列一个独一无二的哈希值H,这样我们只需要花费O(1)去比较这个值,就能快速比较出两个数列是否相同了

试想将所有数的和直接作为H。但这显然行不通。
那如果我们作为H的是所有数的平方和呢?仍然有反例,但反例少了很多。
再进一步的话,二次不行,咱们还可以立方和,四次方,五次方…甚至可以用指数函数。

但我们完全不能决定序列的顺序。我们可以找一个比所有a都大的p,然后直接把序列当成一个p进制的大数,以此作为H。当然,这个数大到我们存不下来,但没关系,我们还能取模啊!把它对一个大质数取模,就能得到一个近乎不可能重复的哈希值了。同时我们也发现,对于两个相似的序列,只要它们稍稍有一点不同,所得的哈希值就千差万别。完美解决!
序列中顺序非常重要。那么如果把序列中的每一个元素变成一个二元组,第一元是数值,第二元是它的位置,序列就会变成二元组的集合。二位哈希
在这里插入图片描述
至于具体代码。。。

~略

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值