传送门

很蒙蔽,不知道怎么搞。

网上看题解有说可以哈希+二分搞,也有的人说用Manacher搞,Manacher是什么鬼?以后再学。

对于这个题,可以从矩阵4个角hash一遍,然后枚举矩阵中的点,再二分半径。

但是得考虑边的长度为奇偶所带来的影响。

比如

1 1

1 1

这个边数为偶数的矩阵显然没法搞。

所以得在矩阵中插入0,

变成

0 0 0 0 0

0 1 0 1 0

0 0 0 0 0

0 1 0 1 0

0 0 0 0 0

具体操作就看代码好了。

然后只枚举 行 + 列 为偶数的点就行。

注意 用 unsigned long long 会超时和超空间,数据允许用 unsigned int

——代码

 #include <cstdio>
#include <iostream>
#define UI unsigned int const int MAXN = , bs1 = , bs2 = ;
int n, m, ans;
UI sum[][MAXN][MAXN], base1[MAXN], base2[MAXN]; inline int read()
{
int x = , f = ;
char ch = getchar();
for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
return x * f;
} inline int min(int x, int y)
{
return x < y ? x : y;
} inline bool pd(int x, int y, int l)
{
UI t, h;
h = sum[][x + l - ][y + l - ]
- sum[][x - l][y + l - ] * base1[l + l - ]
- sum[][x + l - ][y - l] * base2[l + l - ]
+ sum[][x - l][y - l] * base1[l + l - ] * base2[l + l - ];
t = sum[][x + l - ][y - l + ]
- sum[][x - l][y - l + ] * base1[l + l - ]
- sum[][x + l - ][y + l] * base2[l + l - ]
+ sum[][x - l][y + l] * base1[l + l - ] * base2[l + l - ];
if(h ^ t) return ;
t = sum[][x - l + ][y + l - ]
- sum[][x + l][y + l - ] * base1[l + l - ]
- sum[][x - l + ][y - l] * base2[l + l - ]
+ sum[][x + l][y - l] * base1[l + l - ] * base2[l + l - ];
if(h ^ t) return ;
t = sum[][x - l + ][y - l + ]
- sum[][x + l][y - l + ] * base1[l + l - ]
- sum[][x - l + ][y + l] * base2[l + l - ]
+ sum[][x + l][y + l] * base1[l + l - ] * base2[l + l - ];
if(h ^ t) return ;
return ;
} inline int work(int i, int j)
{
int mid, s = , x = , y = min(min(i, n - i + ), min(j, m - j + ));//二分半径
while(x <= y)
{
mid = (x + y) >> ;
if(pd(i, j, mid)) s = mid, x = mid + ;
else y = mid - ;
}
return s;
} int main()
{
int i, j, k, x;
n = read();
m = read();
n = n << | ;
m = m << | ;
for(i = ; i <= n; i += )
for(j = ; j <= m; j += )
{
x = read();
for(k = ; k < ; k++) sum[k][i][j] = x;
}
base1[] = base2[] = ;
for(i = ; i <= n; i++) base1[i] = base1[i - ] * bs1;
for(i = ; i <= m; i++) base2[i] = base2[i - ] * bs2;
for(i = ; i <= n; i++)
for(j = ; j <= m; j++)
sum[][i][j] += sum[][i - ][j] * bs1;
for(i = ; i <= n; i++)
for(j = ; j <= m; j++)
sum[][i][j] += sum[][i][j - ] * bs2;
for(i = ; i <= n; i++)
for(j = m; j; j--)
sum[][i][j] += sum[][i - ][j] * bs1;
for(i = ; i <= n; i++)
for(j = m; j; j--)
sum[][i][j] += sum[][i][j + ] * bs2;
for(i = n; i; i--)
for(j = ; j <= m; j++)
sum[][i][j] += sum[][i + ][j] * bs1;
for(i = n; i; i--)
for(j = ; j <= m; j++)
sum[][i][j] += sum[][i][j - ] * bs2;
for(i = n; i; i--)
for(j = m; j; j--)
sum[][i][j] += sum[][i + ][j] * bs1;
for(i = n; i; i--)
for(j = m; j; j--)
sum[][i][j] += sum[][i][j + ] * bs2;
for(i = ; i <= n; i++)
for(j = ; j <= m; j++)
if((i ^ j ^ ) & )
ans += work(i, j) >> ;
printf("%d\n", ans);
return ;
}

Manacher的话,学完再搞吧。

[luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)的更多相关文章

  1. BZOJ 1567 Blue Mary的战役地图(二维hash+二分)

    题意: 求两个矩形最大公共子正方形.(n<=50) 范围这么小可以枚举子正方形的边长.那么可以对这个矩形进行二维hash,就可以在O(1)的时候求出任意子矩形的hash值.然后判断这些正方形的h ...

  2. 牛客练习赛1 矩阵 字符串二维hash+二分

    题目 https://ac.nowcoder.com/acm/contest/2?&headNav=www#question 解析 我们对矩阵进行二维hash,所以每个子矩阵都有一个额hash ...

  3. 【BZOJ1414/3705】[ZJOI2009]对称的正方形 二分+hash

    [BZOJ1414/3705][ZJOI2009]对称的正方形 Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们 ...

  4. 题解-------[ZJOI2009]对称的正方形

    传送门 题目大意 找到所有的上下左右都相同的正方形. 思路:二分+二维Hash 这道题我们首先想到不能暴力判断一个正方形是否合法. 然后我们发现当一个正方形合法时,以这个正方形为中心且比它小的正方形也 ...

  5. 二维hash

    题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每 ...

  6. BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash

    1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...

  7. BZOJ1567 [JSOI2008]Blue Mary的战役地图(二分+二维hash)

    题意 问边长为n的两个正方形中最大的相等子正方形.(n<=50) 题解 用到了二维hash,感觉和一维的不太一样. 对于列行有两个不同的进制数然后也是通过类似前缀和的方法差分出一个矩形的hash ...

  8. bzoj 1414: [ZJOI2009]对称的正方形 manacher算法+單調隊列

    1414: [ZJOI2009]对称的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 331  Solved: 149[Submit][Stat ...

  9. BZOJ2351[BeiJing2011]Matrix——二维hash

    题目描述 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...

随机推荐

  1. 【UML】类图Class diagram(转)

    http://blog.csdn.net/sds15732622190/article/details/48860711 前言 说到UML,相信大家就能立刻反应出其中的类图,为什么这么说呢,类图和用例 ...

  2. Python-OpenCV中的resize()函数

    改变图像大小意味着改变尺寸,无论是单独的高或宽,还是两者.也可以按比例调整图像大小. 这里将介绍resize()函数的语法及实例. 语法 函数原型 cv2.resize(src, dsize[, ds ...

  3. Problem Q: C语言习题 计算该日在本年中是第几天

    Problem Q: C语言习题 计算该日在本年中是第几天 Time Limit: 1 Sec  Memory Limit: 128 MBSubmit: 4572  Solved: 2474[Subm ...

  4. Django 的母板及布局(Bootstrap)

    title: Django 的母板及布局(Bootstrap) tags: Django --- Django 的母板及布局(Bootstrap) Django 的母板是作为公共的部分,其他的页面都能 ...

  5. js类型判别大合集

    1.typeof number,string,boolean,undefined,symbol,object,function 对象中除了函数为function,其他对象都判别为object, 缺陷: ...

  6. java基础—网络编程

    一.网络基础概念 首先理清一个概念:网络编程 != 网站编程,网络编程现在一般称为TCP/IP编程.

  7. [vijos]P1514 天才的记忆

    背景 神仙飞啊飞 描述 从前有个人名叫W and N and B,他有着天才般的记忆力,他珍藏了许多许多的宝藏.在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以 ...

  8. C++ 学习笔记(五)类的知识小结一(重载,友元函数,静态成员,new)

    ---恢复内容开始--- 学习C++类知识点还是挺多的,每个知识点学习的时候都觉得这个知识点咋那么多东西,其实真学完了再回头看好像也就那么点.这次用程序写一个黑猫揍白猫的故事总结一下这段时间学习的零碎 ...

  9. scipy学习之(二)——io操作及其misc操作对图片的处理

    SciPy有许多模块.类和函数,io子模块可用于从各种文件格式中读取数据和将数据写入各种文件格式. from scipy import io import numpy as np 生成数据 data ...

  10. vim小操作

    初时,先有ed,ed为ex之父,ex为vi之父,而vi为vim之父 c 修改 d 删除 y 复制到寄存器 g~ 反转大小写 gu 反转为小写 gU 反转为大写 > 增加缩进 < 减小缩进 ...