分析
枚举正方形的中心点
然后尽量向外扩展
对于判断一个正方形是否上下左右对称。只需要左右翻转,上下反转,看一下是否还是与原来相等的三角形。
先预处理二维前缀和(按照哈希方法,把一个字符串看成T进制数,然后mod一个很大的质数用于定位)。
然后就可以O(1)求出某个小矩阵的哈希值,然后进行翻转。
二分的是最长的能扩展到的地方。用于判断是否能继续扩展,如果不能,最长的地方为mid-1(mid是现在扩展到的地方)
每个判断成功的矩阵都能使ans++
不用去重,因为枚举到的正方形要不是中心点不同,要不是大小不同
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef unsigned long long ull;
int n,m,a[1001][1001],ans;
ull fanx[1001][1001],fany[1001][1001];
ull hx[1001],hy[1001];
ull p1=131,p2=313;
void hash()
{
hx[0]=1;hy[0]=1;
for(int i=1;i<=max(n,m);i++)
{
hx[i]=hx[i-1]*p1;
hy[i]=hy[i-1]*p2;
}
for(int i=1;i<=n;i++)
{
for(