【BZOJ1414】[ZJOI2009]对称的正方形(哈希)

题面

BZOJ

洛谷

题解

深思熟虑一波,发现一个矩阵如果左右对称的话,那么它每行都是一个回文串,同理,如果上下对称的话,那么每列都是一个回文串。既然每行每列都是一个回文串,那么我们把它中心对称一下它还是一个回文串,妙蛙。

我们在矩阵中间补上\(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]对称的正方形(哈希)的更多相关文章

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

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

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

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

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

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

  4. bzoj 1414: [ZJOI2009]对称的正方形

    Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们排成了一个n行m列的矩阵.通过观察,Orez发现这些数据蕴涵了一 ...

  5. [luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)

    传送门 很蒙蔽,不知道怎么搞. 网上看题解有说可以哈希+二分搞,也有的人说用Manacher搞,Manacher是什么鬼?以后再学. 对于这个题,可以从矩阵4个角hash一遍,然后枚举矩阵中的点,再二 ...

  6. luoguP2601 对称的正方形

    题目描述 给出一个数字矩形,求这个矩形中有多少个子正方形满足上下对称.左右对称. 思路 我们可以用3个哈希数组 \(a\ b\ c\) 分别表示矩形从左上往右下看,从左下往右上看,从右上往左下看的样子 ...

  7. 【bzoj 1414】对称的正方形 单调队列+manacher

    Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们排成了一个n行m列的矩阵.通过观察,Orez发现这些数据蕴涵了一 ...

  8. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  9. manacher算法学习(求最长回文子串长度)

    Manacher总结 我的代码 学习:yyb luogu题目模板 xzy的模板 #include<iostream> #include<cstdlib> #include< ...

随机推荐

  1. Android导入AS工程

     AS  导入工程 还得 新建工程贴代码 

  2. 带您详细解读分布式文件系统HDFS

    一.HDFS的由来: 本地系统:一个节点作为系统,以前数据是存放在本地文件系统上的,但本地文件系统存在两个问题:1.本地节点存储容量不够大:2.本地节点会坏,数据不够安全.这时,人们开始利用闲置的计算 ...

  3. Django Rest Framework源码剖析(五)-----解析器

    一.简介 解析器顾名思义就是对请求体进行解析.为什么要有解析器?原因很简单,当后台和前端进行交互的时候数据类型不一定都是表单数据或者json,当然也有其他类型的数据格式,比如xml,所以需要解析这类数 ...

  4. frameset的各个frame之间互相访问的方法

    工作中很少使用到frameset,对其了解也是十分有限,这里在网上找了点资料,摘抄了部分内容. (1)获得html页面上的frame window.frames可以获得本页面上所有frame集合,用法 ...

  5. 使用Fortify进行代码静态分析(系列文章)

    BUG级别:低 Code Correctness(代码正确性) 1.Class does not Implement Equals(类未能实现Equals方法) Dead Code(死亡代码) 1.U ...

  6. STM32-M0中断优先级介绍

    先解释中断优先级,后面讲代码的实现. 差异:M0的中断优先级相比于M4,没有用到分组,且只用到了2个bit位(即0~3)来设置,数值越小,优先级越高:同等优先级,根据终端号的大小来决定谁先执行. 根据 ...

  7. Tomcat 基础二

    1.Tomcat 实现了一个新的Servlet容器Catalina: 2.Tomcat:         ROOT         |         |____      /             ...

  8. 小知识点--crontab

    前言 这两周学了很多东西,还把golang语言基本掌握了,收获还是挺多的.在做安全的过程中,有很多需要定时执行的任务,比如抓取主机数量,端口数据等,这都逃不开linux中的crontab命令,今天分享 ...

  9. OPENSTACK重装系统失败导致虚拟机状态为error

    重装系统失败导致虚拟机状态为error DASHBOARD查看虚拟机状态: 查看日志: 磁盘不足导致下载新镜像失败. Virsh list -all 无法发现虚拟机,底层盘消失(因为重装系统时nova ...

  10. 关于ueditor一些使用记录

    1.使用的引用配置顺序 <script src="utf8-net/ueditor.config.js"></script> <script src= ...