对称正方形【二维Hash】【二分】

本文介绍了如何利用二维哈希和二分查找解决对称正方形的问题。作者通过枚举中心点并计算扩散长度,检查形成的正方形是否对称合法。在解题过程中,提到了预处理矩阵及其镜像的哈希值,并分享了在实际编程中遇到的错误及修正方法,最终成功解决问题。
摘要由CSDN通过智能技术生成

>Link

ybtoj对称正方形

luogu P2601


>解题思路

本着“自己做出来”态度打了一次,不知道为什么怎么都a不了,检查了好多遍都找不出bug,只好看题解的思路打了🤕

枚举每一个中心点,二分最多可以向四周扩散的长度,check当前扩散出的正方形是否合法
这里要用到二维哈希来记录每一个矩阵的状态,求一个左上角是(x,y)右下角是(xx,yy)的矩阵哈希值与前缀和的思想类似(?)
因为是求 对称 正方形,所以一个矩阵肯定要分别左右镜面、上下镜面后都与原矩阵一样,才算合法
这样我们可以预处理出原矩阵、左右镜面、上下镜面的hash,二分时直接计算判断就行了

后续:后面发现luogu上有原题,去交了一下发现有一个点WA了,然后就修改了一下程序,把r的取值中一堆min套min的麻烦东西去掉,换成了max(n,m)然后直接在check里面判断有无越界,然后就A了,果然花里胡哨的东西都是假的 \ (^ ^) /


>代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define ull unsigned long long
#define LL long long
#define N 1010
using namespace std;

const ull p1 = 87, p2 = 31;
int n, m, l, r, mid, w;
LL ans;
ull a[N][N], b[N][N], c[N][N];
ull ha[N][N], hb[N][N], hc[N][N], l1[N], l2[N];

bool check (int ux, int uy, int uxx, int uyy)
{
   
	int x = ux, y = uy, xx = uxx, yy = uyy;
	if (x < 1 || y < 1 || x > n || y > m) return 0;
	if (xx < 1 || yy < 1 || xx > n || yy > m) return 0;
	ull r1 = ha[xx][yy] - ha[<
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值