Description

Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究。最近,Orez又得到了一些数据,并已经把它们排成了一个n行m列的矩阵。通过观察,Orez发现这些数据蕴涵了一个奇特的数,就是矩阵中上下对称且左右对称的正方形子矩阵的个数。 Orez自然很想知道这个数是多少,可是矩阵太大,无法去数。只能请你编个程序来计算出这个数。

Input

文件的第一行为两个整数n和m。接下来n行每行包含m个正整数,表示Orez得到的矩阵。

Output

文件中仅包含一个整数answer,表示矩阵中有answer个上下左右对称的正方形子矩阵。
 
hash+二分确定每个中心的最大对称正方形
#include<cstdio>
char buf[],*ptr=buf;
int _(){
int x=;
while(*ptr<)++ptr;
while(*ptr>)x=x*+*ptr++-;
return x;
}
typedef unsigned int u32;
int n,m;
int a[][];
u32 f[][][],pp1[],pp2[];
long long ans=;
const u32 p1=,p2=;
#define F(i,n) for(int i=1;i<=n;++i)
#define Fd(i,n) for(int i=n;i>=1;--i)
int min(int a,int b){return a<b?a:b;}
bool chk(int l1,int r1,int l2,int r2){
u32 v1=pp1[r1-l1+];
u32 v2=pp2[r1-l1+];
u32 h0=f[][r1][r2]-f[][r1][l2-]*v2-(f[][l1-][r2]-f[][l1-][l2-]*v2)*v1;
u32 h1=f[][r1][l2]-f[][r1][r2+]*v2-(f[][l1-][l2]-f[][l1-][r2+]*v2)*v1;
if(h0!=h1)return ;
u32 h2=f[][l1][r2]-f[][l1][l2-]*v2-(f[][r1+][r2]-f[][r1+][l2-]*v2)*v1;
return h0==h2;
}
int main(){
fread(buf,,sizeof(buf),stdin);
n=_(),m=_();
F(i,n)F(j,m)f[][i][j]=f[][i][j]=f[][i][j]=a[i][j]=_();
F(i,n){
F(j,m)f[][i][j]+=f[][i][j-]*p2;
F(j,m)f[][i][j]+=f[][i-][j]*p1;
}
F(i,n){
Fd(j,m)f[][i][j]+=f[][i][j+]*p2;
Fd(j,m)f[][i][j]+=f[][i-][j]*p1;
}
Fd(i,n){
F(j,m)f[][i][j]+=f[][i][j-]*p2;
F(j,m)f[][i][j]+=f[][i+][j]*p1;
}
pp1[]=pp2[]=;
F(i,n)pp1[i]=pp1[i-]*p1;
F(i,m)pp2[i]=pp2[i-]*p2; F(i,n)F(j,m){
int L=,R=min(min(i-,n-i),min(j-,m-j)),M=;
while(L<R){
if(chk(i-M,i+M,j-M,j+M))L=M;
else R=M-;
M=L+R+>>;
}
ans+=L+;
}
F(i,n-)F(j,m-)if(a[i][j]==a[i][j+]&&a[i][j]==a[i+][j]&&a[i][j]==a[i+][j+]){
int L=,R=min(min(i-,n--i),min(j-,m--j)),M=;
while(L<R){
if(chk(i-M,i+M+,j-M,j+M+))L=M;
else R=M-;
M=L+R+>>;
}
ans+=L+;
}
printf("%lld\n",ans);
return ;
}

bzoj 1414: [ZJOI2009]对称的正方形的更多相关文章

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

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

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

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

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

    [BZOJ1414][ZJOI2009]对称的正方形(哈希) 题面 BZOJ 洛谷 题解 深思熟虑一波,发现一个矩阵如果左右对称的话,那么它每行都是一个回文串,同理,如果上下对称的话,那么每列都是一个 ...

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

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

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

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

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

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

  7. luoguP2601 对称的正方形

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

  8. [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】

    题目链接:BZOJ - 1047 题目分析 使用单调队列在 O(n^2) 的时间内求出每个 n * n 正方形的最大值,最小值.然后就可以直接统计答案了. 横向有 a 个单调队列(代码中是 Q[1] ...

  9. BZOJ 1432: [ZJOI2009]Function

    1432: [ZJOI2009]Function Time Limit: 5 Sec  Memory Limit: 64 MBSubmit: 1046  Solved: 765[Submit][Sta ...

随机推荐

  1. js在类似数组的对象中使用push

    let obj = { "2": "a", "3": "b", length: 3, push: Array.proto ...

  2. Triangles 正多边形分割锐角三角形

    题目描述 已知一个圆的圆周被N个点分成了N段等长圆弧,求任意取三个点,组成锐角三角形的个数. 输入 多组数据,每组数据一个N(N <= 1000000) 输出 对于每组数据,输出不同锐角三角形的 ...

  3. 没有添加spring mvc 默认依赖包产生的错误

    启动tomcat的时候提示:java.lang.IllegalStateException: ContainerBase.addChild: start: org.apache.catalina.Li ...

  4. SharePoint 企业搜索-PowerShell

    1. 显示企业搜索服务信息 Get-SPEnterpriseSear1chService 2. 显示企业搜索服务实例 Get-SPEnterpriseSearchServiceInstance 3. ...

  5. 关于junk jack

    旨在利用一切物品打造你自己的世界.你需要砍树获得木头,挖各种矿石用火炉炼成不同东西,顺便得到不同颜色材质的石头建房子,打各种家禽获得吃的甚至烘焙.养起来繁殖,天上掉下的星星.捡到圣诞礼包中的袜子都可以 ...

  6. redis下载安装

    在linux下下载redis $ wget http://download.redis.io/releases/redis-4.0.9.tar.gz 如果没有网络的话可以先下载安装包再移到linux虚 ...

  7. 2018-2019-2 网络对抗技术 20165202 Exp3 免杀原理与实践

    博客目录 一.基础问题回答 二.实践内容 1.使用msf编码器msfvenom生成后门程序 2.使用msf编码器msfvenom生成jar文件 3.使用veil-evasion生成后门程序及检测 4. ...

  8. Foundation--结构体

    一,NSRange typedef struct _NSRange { NSUInteger location; NSUInteger length; }NSRange; 这个结构体用来表示事物的一个 ...

  9. TX2平台CAN总线收发功能的测试

    前言 项目实现过程中需要将获取的数据信息通过CAN总线传输到控制规划模块,本文主要介绍如何在TX2平台测试CAN总线的收发功能. TX2是英伟达旗下为嵌入式平台人工智能应用开发出的一个硬件平台,TX1 ...

  10. HDU 4669 Mutiples on a circle 数位DP

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4669 考察对取模的的理解深不深刻啊,当然还有状态的设计····设d[i][j]表示以第i个数结尾,余 ...