>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[<