链接
题目描述
给定一个n 行m 列的矩阵。
求矩阵中上下对称且左右对称的正方形子矩阵的个数。
样例输入
5 5
4 2 4 4 4
3 1 4 4 3
3 5 3 3 3
3 1 5 3 3
4 2 1 2 4
样例输出
27
思路
将矩阵上下颠倒一次,左右颠倒一次,再求出每个矩阵的每个区间矩阵的hash值,二分正方形的个数,比较hash值就可以判断是否是上下左右对称。
一个合法正方形满足在该正方形下的正方形都是合法的
代码
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#define zhi1 1000000007ull
#define zhi2 1000000009ull
#define ull unsigned long long
using namespace std;
int n, m, tot, lx, ly, hash1, hash2, hash3, ans, l, r;
ull hasha[1005][1005], hashb[1005][1005], hashc[1005][1005];
ull a[1005][1005], b[1005][1005], c[1005][1005], t1[10005], t2[10005];
bool check(int rx, int ry, int dis) {
lx = rx - dis + 1;
ly = ry - dis + 1;
hash1 = hasha[rx][ry] - hasha[rx][ly - 1] * t1[dis] - hasha[lx - 1][ry] * t2[dis] + hasha[lx - 1][ly - 1] * t1[dis] * t2