【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. 网络对抗技术 2017-2018-2 20152515 Exp6 信息搜集与漏洞扫描

    1.实践目标 掌握信息搜集的最基础技能与常用工具的使用方法.包括: (1)各种搜索技巧的应用 (2)DNS IP注册信息的查询 (3)基本的扫描技术:主机发现.端口扫描.OS及服务版本探测.具体服务的 ...

  2. 20155239吕宇轩 Exp1 PC平台逆向破解(5)M

    20155239 网络对抗 Exp1 PC平台逆向破解(5)M 实验内容 (1).掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码(1分) (2)掌握反汇编与十六进制编程器 (1分) ...

  3. 利用RMAN转移裸设备到文件系统

    本文只是为了个人备忘. 参考eagyle的:http://www.eygle.com/archives/2005/12/oracle_howto_move_datafile_raw.html 我首先挂 ...

  4. CodeForces-1155D Beautiful Array

    Description You are given an array \(a\) consisting of \(n\) integers. Beauty of array is the maximu ...

  5. mysql安装版多次安装导致安装失败的解决方法(windows)(直接使用免安装方法)

    https://www.cnblogs.com/feilongblog/p/mysql_install_init.html 测试成功 要点:mysqld install MySQL --default ...

  6. Execute SQL Task 如何返回结果数据集

    Execute Sql Task的Result DataSet 主要有以下四种,当Execute Sql Task返回结果之后,需要使用SSIS Variable 来接收数据. 例子中使用的数据表代码 ...

  7. 【分享】熟练的Java程序员应该掌握哪些技术?

    Java程序员应该掌握哪些能力才能算是脱离菜鸟达到熟练的程度? 1.语法:Java程序员必须比较熟悉语法,在写代码的时候IDE的编辑器对某一行报错应该能够根据报错信息 知道是什么样的语法错误并且知道任 ...

  8. phabricator 结合 arcanist 使用

    简介 arcanist 是 phabricator 接口的命令工具,主要用于提交 diff 和 push review 通过的commit. 安装 下载源码,然后指定系统的环境变量即可 $ some_ ...

  9. 通过Mysql连接ASP.Net Core2.0(Code First模式)

    ASP.NET Core2.0连接Mysql,首先新建项目 选择Web应用程序 选择需要身份验证: 通过Nuget安装Mysql驱动,这里推荐>Pomelo.EntityFrameworkCor ...

  10. 金蝶盘点机PDA仓库条码管理家电类序列号扫描操作方法-采购入库单

    1.1.  采购入库单 传统的进销存管理软件需要人工识别商品品种,清点商品数量,然后再去人工手工在电脑上一行行的录入采购入库单.录单效率低,误差大. 如果使用汉码盘点机PDA,入库时,仓管员只需要手持 ...