【洛谷 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