[luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)
很蒙蔽,不知道怎么搞。
网上看题解有说可以哈希+二分搞,也有的人说用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)的更多相关文章
- BZOJ 1567 Blue Mary的战役地图(二维hash+二分)
题意: 求两个矩形最大公共子正方形.(n<=50) 范围这么小可以枚举子正方形的边长.那么可以对这个矩形进行二维hash,就可以在O(1)的时候求出任意子矩形的hash值.然后判断这些正方形的h ...
- 牛客练习赛1 矩阵 字符串二维hash+二分
题目 https://ac.nowcoder.com/acm/contest/2?&headNav=www#question 解析 我们对矩阵进行二维hash,所以每个子矩阵都有一个额hash ...
- 【BZOJ1414/3705】[ZJOI2009]对称的正方形 二分+hash
[BZOJ1414/3705][ZJOI2009]对称的正方形 Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们 ...
- 题解-------[ZJOI2009]对称的正方形
传送门 题目大意 找到所有的上下左右都相同的正方形. 思路:二分+二维Hash 这道题我们首先想到不能暴力判断一个正方形是否合法. 然后我们发现当一个正方形合法时,以这个正方形为中心且比它小的正方形也 ...
- 二维hash
题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每 ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash
1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...
- BZOJ1567 [JSOI2008]Blue Mary的战役地图(二分+二维hash)
题意 问边长为n的两个正方形中最大的相等子正方形.(n<=50) 题解 用到了二维hash,感觉和一维的不太一样. 对于列行有两个不同的进制数然后也是通过类似前缀和的方法差分出一个矩形的hash ...
- bzoj 1414: [ZJOI2009]对称的正方形 manacher算法+單調隊列
1414: [ZJOI2009]对称的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 331 Solved: 149[Submit][Stat ...
- BZOJ2351[BeiJing2011]Matrix——二维hash
题目描述 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...
随机推荐
- coredata栈
上下文包含所有信息 NSManagedObjectModel The NSManagedObjectModel instance describes the data that is going to ...
- [OpenMP] 并行计算入门
OpenMP并行计算入门 个人理解 OpenMP是一种通过共享内存并行系统的多处理器程序设计的编译处理方案,通过预编译指令告诉编译器哪些代码块需要被并行化,通过拷贝代码块实现并行程序.对于循环的并行化 ...
- js引入的数组 会被页面缓存,如需要被强制性不缓存,请用function return 就ok了
js引入的数组 会被页面缓存,如需要被强制性不缓存,请用function return 就ok了
- DB2中创建表
CONNECT TO TEST; CREATE TABLE DB2ADMIN.PERSON ( ID BIGINT NOT NULL , NAME BIGINT , FLAG BIGINT , ADD ...
- NSXMLParser
NSXMLParser的使用 2011-05-05 15:50:17| 分类: 解析|字号 订阅 NSXMLParser解析xml格式的数据 用法如下: 首先,NSXMLParser必须继续 ...
- Vue和MVVM对应关系
Vue和MVVM的对应关系 Vue是受MVVM启发的,那么有哪些相同之处呢?以及对应关系? MVVM(Model-view-viewmodel) MVVM还有一种模式model-view-binder ...
- Chunky Monkey-freecodecamp算法题目
Chunky Monkey(猴子吃香蕉, 分割数组) 要求 把一个数组arr按照指定的数组大小size分割成若干个数组块. 思路 利用size值和while语句确定切割数组的次数(定义temp将siz ...
- 【转】BP神经网络
学习是神经网络一种最重要也最令人注目的特点.在神经网络的发展进程中,学习算法的研究有着十分重要的地位.目前,人们所提出的神经网络模型都是和学习算 法相应的.所以,有时人们并不去祈求对模型和算法进行严格 ...
- [BZOJ] 1127: [POI2008]KUP
似曾相识的感觉 考虑另一个判断问题,给定一个k,问这个k是否可行 存在矩形和\(sum>2k\),则该矩阵不对判定做出贡献 存在矩形和\(sum\in [k,2k]\),则我们找到了一个解 于是 ...
- destoon 列表页面增加手动选择排序方式
在mobile/include/mall.inc.php 行60 $order = $MOD['order']; 之前增加 排序方式判断 如果有order参数则$order接受参数,没有就用默认 ...