【洛谷 P2601】 【hash】 对称的正方形

该博客介绍了如何解决洛谷P2601问题,利用hash处理二维矩阵的对称性,通过翻转和中心点枚举,二分查找最大对称正方形的边长,并计算所有对称正方形的贡献。文章提到该解法已通过洛谷平台验证,但在ybtoj上出现错误。
摘要由CSDN通过智能技术生成

【洛谷 P2601】 【hash】 对称的正方形

题目

在这里插入图片描述


解题思路

这个相似
只是变成了二维
对称有两种,上下和左右
处理3次hash(原来的矩形,上下翻转后的,左右翻转后的)
枚举中心点
二分出最大的对称正方形的边长
以这个正方形的中心且比ta小的正方形也是对称的
即可算入贡献


代码

#include<iostream>
#include<cstdio>
using namespace std;
const int p1=92083,p2=69061;
int n,m;
long long v1,v2,v3,tot;
long long pw[100010],pwf[100010];
long long a[1003][1003],xf[1003][1003],yf[1003][1003];
long long hash[1003][1003],hash2[1003][1003],hash3[1003][1003];
bool check(int x,int y,int mid)
{
    
	 v1=hash[x][y]-hash[x-mid][y]*pwf[mid]-hash[x][y-mid]*pw[mid]+hash[x-mid][y-mid]*pw[mid]*pwf[mid];
	 int j=m-(y-mid); //翻转后正方形的坐标发生了变化
	 v2=hash2[x][j]-hash2[x-mid][j]*pwf[mid]-hash2[x
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值