【BZOJ1414】[ZJOI2009]对称的正方形(哈希)
【BZOJ1414】[ZJOI2009]对称的正方形(哈希)
题面
题解
深思熟虑一波,发现一个矩阵如果左右对称的话,那么它每行都是一个回文串,同理,如果上下对称的话,那么每列都是一个回文串。既然每行每列都是一个回文串,那么我们把它中心对称一下它还是一个回文串,妙蛙。
我们在矩阵中间补上\(0\),这样子就有回文中心了,对于每一个中心算算它往左右能够拓展的最大回文串的长度,然后二分计算一下能够得到的最大矩阵就好了。
至于哈希什么的,自己随便YY一下吧,我自己写半天不会,直接照着别人的写了一遍额。。
#include<iostream>
#include<cstdio>
using namespace std;
#define uint unsigned int
#define MAX 2020
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
const uint base1=19260817,base2=233;
int n,m,g[MAX][MAX],ans,tot;
uint pw1[MAX*MAX],pw2[MAX*MAX],s[3][MAX][MAX];
bool check(int l1,int r1,int l2,int r2)
{
int len1=r1-l1+1,len2=r2-l2+1;
int s0=s[0][r1][r2]-s[0][r1][l2-1]*pw2[len2]-s[0][l1-1][r2]*pw1[len1]+s[0][l1-1][l2-1]*pw1[len1]*pw2[len2];
int s1=s[1][r1][l2]-s[1][r1][r2+1]*pw2[len2]-s[1][l1-1][l2]*pw1[len1]+s[1][l1-1][r2+1]*pw1[len1]*pw2[len2];
int s2=s[2][l1][r2]-s[2][l1][l2-1]*pw2[len2]-s[2][r1+1][r2]*pw1[len1]+s[2][r1+1][l2-1]*pw1[len1]*pw2[len2];
if(s0!=s1||s0!=s2||s1!=s2)return false;
return true;
}
int main()
{
n=read();m=read();
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
g[i*2-1][j*2-1]=read();
n=n*2-1,m=m*2-1;tot=n*m;pw1[0]=pw2[0]=1;
for(int i=1;i<=tot;++i)pw1[i]=pw1[i-1]*base1;
for(int i=1;i<=tot;++i)pw2[i]=pw2[i-1]*base2;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
s[0][i][j]=s[0][i][j-1]*base2+g[i][j];
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
s[0][i][j]+=s[0][i-1][j]*base1;
for(int i=1;i<=n;++i)
for(int j=m;j;--j)
s[1][i][j]=s[1][i][j+1]*base2+g[i][j];
for(int i=1;i<=n;++i)
for(int j=m;j;--j)
s[1][i][j]+=s[1][i-1][j]*base1;
for(int i=n;i;--i)
for(int j=1;j<=m;++j)
s[2][i][j]=s[2][i][j-1]*base2+g[i][j];
for(int i=n;i;--i)
for(int j=1;j<=m;++j)
s[2][i][j]+=s[2][i+1][j]*base1;
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
if(!((i+j)&1))
{
int l=1,r=min(min(i,n-i+1),min(j,m-j+1)),ret=0;
while(l<=r)
{
int mid=(l+r)>>1;
if(check(i-mid+1,i+mid-1,j-mid+1,j+mid-1))ret=mid,l=mid+1;
else r=mid-1;
}
ans+=(ret+(i&1))>>1;
}
printf("%d\n",ans);
return 0;
}
【BZOJ1414】[ZJOI2009]对称的正方形(哈希)的更多相关文章
- 【BZOJ1414/3705】[ZJOI2009]对称的正方形 二分+hash
[BZOJ1414/3705][ZJOI2009]对称的正方形 Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们 ...
- bzoj 1414: [ZJOI2009]对称的正方形 manacher算法+單調隊列
1414: [ZJOI2009]对称的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 331 Solved: 149[Submit][Stat ...
- 题解-------[ZJOI2009]对称的正方形
传送门 题目大意 找到所有的上下左右都相同的正方形. 思路:二分+二维Hash 这道题我们首先想到不能暴力判断一个正方形是否合法. 然后我们发现当一个正方形合法时,以这个正方形为中心且比它小的正方形也 ...
- bzoj 1414: [ZJOI2009]对称的正方形
Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们排成了一个n行m列的矩阵.通过观察,Orez发现这些数据蕴涵了一 ...
- [luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)
传送门 很蒙蔽,不知道怎么搞. 网上看题解有说可以哈希+二分搞,也有的人说用Manacher搞,Manacher是什么鬼?以后再学. 对于这个题,可以从矩阵4个角hash一遍,然后枚举矩阵中的点,再二 ...
- luoguP2601 对称的正方形
题目描述 给出一个数字矩形,求这个矩形中有多少个子正方形满足上下对称.左右对称. 思路 我们可以用3个哈希数组 \(a\ b\ c\) 分别表示矩形从左上往右下看,从左下往右上看,从右上往左下看的样子 ...
- 【bzoj 1414】对称的正方形 单调队列+manacher
Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们排成了一个n行m列的矩阵.通过观察,Orez发现这些数据蕴涵了一 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- manacher算法学习(求最长回文子串长度)
Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...
随机推荐
- UWP 下载文件显示下载进度
<Page x:Class="WgscdProject.TestDownloadPage" xmlns="http://schemas.microsoft.com/ ...
- 20155226 《网络对抗》Exp9 Web安全基础
20155226 <网络对抗>Exp9 Web安全基础 实践过程 开启webgoat 输入java -jar webgoat-container-7.1-exec.jar 在浏览器输入lo ...
- 20155323刘威良《网络对抗》Exp7 网络欺诈防范
20155323刘威良<网络对抗>Exp7 网络欺诈防范 实践目标 理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 实践内容 (1)简单应用SET工具建立冒名网站 (1分 ...
- 6、Docker图形化管理(Portainer)
一.Portainer简介 Portainer是Docker的图形化管理工具,提供状态显示面板.应用模板快速部署.容器镜像网络数据卷的基本操作(包括上传下载镜像,创建容器等操作).事件日志显示.容器控 ...
- jstree API
https://www.jstree.com/ drag & drop support(拖放) keyboard navigation(键盘导航) inline edit, create ...
- Linux 僵尸进程
Linux 允许进程查询内核以获得其父进程的 PID,或者其任何子进程的执行状态.例如,进程可以创建一个子进程来执行特定的任务,然后调用诸如 wait() 这样的一些库函数检查子进程是否终止.如果子进 ...
- Deferred Shading 延迟着色(翻译)
原文地址:https://en.wikipedia.org/wiki/Deferred_shading 在3D计算机图形学领域,deferred shading 是一种屏幕空间着色技术.它被称为Def ...
- anoconda 神经网络 相关操作
1. conda 相关操作 建立新环境:conda crearte -n NewName python=版本(3.6) 激活环境:conda activate NewName 关闭环境:conda d ...
- 了不起的Node.js--之四
阻塞与非阻塞IO 绝大多数对node.js的讨论都把关注点放在了其处理高并发的能力上.Node框架给开发者提供了构建高性能网络应用的强大能力. 我使用的开发工具是Mac版的WebStorm,这个工具支 ...
- SQL邮件服务(解决各种疑难杂症)+案例 + 使用SQLserver 邮件系统发送SQL代理作业执行警告
首先你需要知道你要做的几部: 1 每个数据库都有自己的 SERVICE BROKER 很多SQL SERVER内部服务依赖它 2 启动 SERVICE BROKER 需要 1 STOP 你的 SQL ...