Description

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

Input

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

Output

文件中仅包含一个整数answer,表示矩阵中有answer个上下左右对称的正方形子矩阵。
 
hash+二分确定每个中心的最大对称正方形
  1. #include<cstdio>
  2. char buf[],*ptr=buf;
  3. int _(){
  4. int x=;
  5. while(*ptr<)++ptr;
  6. while(*ptr>)x=x*+*ptr++-;
  7. return x;
  8. }
  9. typedef unsigned int u32;
  10. int n,m;
  11. int a[][];
  12. u32 f[][][],pp1[],pp2[];
  13. long long ans=;
  14. const u32 p1=,p2=;
  15. #define F(i,n) for(int i=1;i<=n;++i)
  16. #define Fd(i,n) for(int i=n;i>=1;--i)
  17. int min(int a,int b){return a<b?a:b;}
  18. bool chk(int l1,int r1,int l2,int r2){
  19. u32 v1=pp1[r1-l1+];
  20. u32 v2=pp2[r1-l1+];
  21. u32 h0=f[][r1][r2]-f[][r1][l2-]*v2-(f[][l1-][r2]-f[][l1-][l2-]*v2)*v1;
  22. u32 h1=f[][r1][l2]-f[][r1][r2+]*v2-(f[][l1-][l2]-f[][l1-][r2+]*v2)*v1;
  23. if(h0!=h1)return ;
  24. u32 h2=f[][l1][r2]-f[][l1][l2-]*v2-(f[][r1+][r2]-f[][r1+][l2-]*v2)*v1;
  25. return h0==h2;
  26. }
  27. int main(){
  28. fread(buf,,sizeof(buf),stdin);
  29. n=_(),m=_();
  30. F(i,n)F(j,m)f[][i][j]=f[][i][j]=f[][i][j]=a[i][j]=_();
  31. F(i,n){
  32. F(j,m)f[][i][j]+=f[][i][j-]*p2;
  33. F(j,m)f[][i][j]+=f[][i-][j]*p1;
  34. }
  35. F(i,n){
  36. Fd(j,m)f[][i][j]+=f[][i][j+]*p2;
  37. Fd(j,m)f[][i][j]+=f[][i-][j]*p1;
  38. }
  39. Fd(i,n){
  40. F(j,m)f[][i][j]+=f[][i][j-]*p2;
  41. F(j,m)f[][i][j]+=f[][i+][j]*p1;
  42. }
  43. pp1[]=pp2[]=;
  44. F(i,n)pp1[i]=pp1[i-]*p1;
  45. F(i,m)pp2[i]=pp2[i-]*p2;
  46.  
  47. F(i,n)F(j,m){
  48. int L=,R=min(min(i-,n-i),min(j-,m-j)),M=;
  49. while(L<R){
  50. if(chk(i-M,i+M,j-M,j+M))L=M;
  51. else R=M-;
  52. M=L+R+>>;
  53. }
  54. ans+=L+;
  55. }
  56. 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+]){
  57. int L=,R=min(min(i-,n--i),min(j-,m--j)),M=;
  58. while(L<R){
  59. if(chk(i-M,i+M+,j-M,j+M+))L=M;
  60. else R=M-;
  61. M=L+R+>>;
  62. }
  63. ans+=L+;
  64. }
  65. printf("%lld\n",ans);
  66. return ;
  67. }

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. bzoj3040

    题解: 模板题,地界特斯拉+堆优化 注意第一种建边 代码: #include<bits/stdc++.h> using namespace std; typedef long long l ...

  2. WordCount:C语言实现

    项目地址:https://github.com/m8705/WordCount 项目要求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数. 这个项目要求写一个命令行程序,模仿已 ...

  3. java发生邮件(转)

    参考链接:http://www.runoob.com/java/java-sending-email.html package test.mail; import com.sun.mail.util. ...

  4. JQuery, Silverlight 公用WCF

    WCF web.config配置: <?xml version="1.0"?> <configuration> <system.web> < ...

  5. union-find算法

     1.背景 <算法>一书中提到了关于算法的一些基本思想 优秀的算法因为能够解决实际的问题而变得更为重要: 高效算法的代码可以很简单: 理解某个实现的性能特点是一项有趣而令人满足的挑战: 在 ...

  6. HDU 4585

    http://acm.hdu.edu.cn/showproblem.php?pid=4585 从原来的人中找出战斗数值最接近的,输出他们两人的序号 要在logn的复杂度完成查找,我用的是set,当然用 ...

  7. 【机器学习算法】AdaBoost自适应提升算法

    前言 AdaBoost的算法步骤比较容易理解,可以参考李航老师的<统计学习方法>和July的blog. 对博主而言,最主要的是迭代部分的第二步骤是如何如何确定阈值呢,也就是说有一个特征就有 ...

  8. stm32 内部温度传感器的配置

    STM32的内部温度传感器和ADCx—IN16输入通道相连接.且温度传感器推荐采样时间为17.1us,支持的温度范围为:-40~125度,精度比较差,± 5℃左右. 计算温度值:T(℃) ={(V25 ...

  9. HDU - 2475:Box(splay维护森林)

    There are N boxes on the ground, which are labeled by numbers from 1 to N. The boxes are magical, th ...

  10. Ubuntu终端及VI 快捷键

    Ubuntu终端 快捷键 功能 Tab 自动补全 Ctrl+a 光标移动到开始位置 Ctrl+e 光标移动到最末尾 Ctrl+k 删除此处至末尾的所有内容 Ctrl+u 删除此处至开始的所有内容 Ct ...