[luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)
很蒙蔽,不知道怎么搞。
网上看题解有说可以哈希+二分搞,也有的人说用Manacher搞,Manacher是什么鬼?以后再学。
对于这个题,可以从矩阵4个角hash一遍,然后枚举矩阵中的点,再二分半径。
但是得考虑边的长度为奇偶所带来的影响。
比如
1 1
1 1
这个边数为偶数的矩阵显然没法搞。
所以得在矩阵中插入0,
变成
0 0 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 0 1 0
0 0 0 0 0
具体操作就看代码好了。
然后只枚举 行 + 列 为偶数的点就行。
注意 用 unsigned long long 会超时和超空间,数据允许用 unsigned int
——代码
- #include <cstdio>
- #include <iostream>
- #define UI unsigned int
- const int MAXN = , bs1 = , bs2 = ;
- int n, m, ans;
- UI sum[][MAXN][MAXN], base1[MAXN], base2[MAXN];
- inline int read()
- {
- int x = , f = ;
- char ch = getchar();
- for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -;
- for(; isdigit(ch); ch = getchar()) x = (x << ) + (x << ) + ch - '';
- return x * f;
- }
- inline int min(int x, int y)
- {
- return x < y ? x : y;
- }
- inline bool pd(int x, int y, int l)
- {
- UI t, h;
- h = sum[][x + l - ][y + l - ]
- - sum[][x - l][y + l - ] * base1[l + l - ]
- - sum[][x + l - ][y - l] * base2[l + l - ]
- + sum[][x - l][y - l] * base1[l + l - ] * base2[l + l - ];
- t = sum[][x + l - ][y - l + ]
- - sum[][x - l][y - l + ] * base1[l + l - ]
- - sum[][x + l - ][y + l] * base2[l + l - ]
- + sum[][x - l][y + l] * base1[l + l - ] * base2[l + l - ];
- if(h ^ t) return ;
- t = sum[][x - l + ][y + l - ]
- - sum[][x + l][y + l - ] * base1[l + l - ]
- - sum[][x - l + ][y - l] * base2[l + l - ]
- + sum[][x + l][y - l] * base1[l + l - ] * base2[l + l - ];
- if(h ^ t) return ;
- t = sum[][x - l + ][y - l + ]
- - sum[][x + l][y - l + ] * base1[l + l - ]
- - sum[][x - l + ][y + l] * base2[l + l - ]
- + sum[][x + l][y + l] * base1[l + l - ] * base2[l + l - ];
- if(h ^ t) return ;
- return ;
- }
- inline int work(int i, int j)
- {
- int mid, s = , x = , y = min(min(i, n - i + ), min(j, m - j + ));//二分半径
- while(x <= y)
- {
- mid = (x + y) >> ;
- if(pd(i, j, mid)) s = mid, x = mid + ;
- else y = mid - ;
- }
- return s;
- }
- int main()
- {
- int i, j, k, x;
- n = read();
- m = read();
- n = n << | ;
- m = m << | ;
- for(i = ; i <= n; i += )
- for(j = ; j <= m; j += )
- {
- x = read();
- for(k = ; k < ; k++) sum[k][i][j] = x;
- }
- base1[] = base2[] = ;
- for(i = ; i <= n; i++) base1[i] = base1[i - ] * bs1;
- for(i = ; i <= m; i++) base2[i] = base2[i - ] * bs2;
- for(i = ; i <= n; i++)
- for(j = ; j <= m; j++)
- sum[][i][j] += sum[][i - ][j] * bs1;
- for(i = ; i <= n; i++)
- for(j = ; j <= m; j++)
- sum[][i][j] += sum[][i][j - ] * bs2;
- for(i = ; i <= n; i++)
- for(j = m; j; j--)
- sum[][i][j] += sum[][i - ][j] * bs1;
- for(i = ; i <= n; i++)
- for(j = m; j; j--)
- sum[][i][j] += sum[][i][j + ] * bs2;
- for(i = n; i; i--)
- for(j = ; j <= m; j++)
- sum[][i][j] += sum[][i + ][j] * bs1;
- for(i = n; i; i--)
- for(j = ; j <= m; j++)
- sum[][i][j] += sum[][i][j - ] * bs2;
- for(i = n; i; i--)
- for(j = m; j; j--)
- sum[][i][j] += sum[][i + ][j] * bs1;
- for(i = n; i; i--)
- for(j = m; j; j--)
- sum[][i][j] += sum[][i][j + ] * bs2;
- for(i = ; i <= n; i++)
- for(j = ; j <= m; j++)
- if((i ^ j ^ ) & )
- ans += work(i, j) >> ;
- printf("%d\n", ans);
- return ;
- }
Manacher的话,学完再搞吧。
[luoguP2601] [ZJOI2009]对称的正方形(二维Hash + 二分 || Manacher)的更多相关文章
- BZOJ 1567 Blue Mary的战役地图(二维hash+二分)
题意: 求两个矩形最大公共子正方形.(n<=50) 范围这么小可以枚举子正方形的边长.那么可以对这个矩形进行二维hash,就可以在O(1)的时候求出任意子矩形的hash值.然后判断这些正方形的h ...
- 牛客练习赛1 矩阵 字符串二维hash+二分
题目 https://ac.nowcoder.com/acm/contest/2?&headNav=www#question 解析 我们对矩阵进行二维hash,所以每个子矩阵都有一个额hash ...
- 【BZOJ1414/3705】[ZJOI2009]对称的正方形 二分+hash
[BZOJ1414/3705][ZJOI2009]对称的正方形 Description Orez很喜欢搜集一些神秘的数据,并经常把它们排成一个矩阵进行研究.最近,Orez又得到了一些数据,并已经把它们 ...
- 题解-------[ZJOI2009]对称的正方形
传送门 题目大意 找到所有的上下左右都相同的正方形. 思路:二分+二维Hash 这道题我们首先想到不能暴力判断一个正方形是否合法. 然后我们发现当一个正方形合法时,以这个正方形为中心且比它小的正方形也 ...
- 二维hash
题目描述 给出一个n * m的矩阵.让你从中发现一个最大的正方形.使得这样子的正方形在矩阵中出现了至少两次.输出最大正方形的边长. 输入描述: 第一行两个整数n, m代表矩阵的长和宽: 接下来n行,每 ...
- BZOJ 1567: [JSOI2008]Blue Mary的战役地图 矩阵二维hash
1567: [JSOI2008]Blue Mary的战役地图 Description Blue Mary最近迷上了玩Starcraft(星际争霸) 的RPG游戏.她正在设法寻找更多的战役地图以进一步提 ...
- BZOJ1567 [JSOI2008]Blue Mary的战役地图(二分+二维hash)
题意 问边长为n的两个正方形中最大的相等子正方形.(n<=50) 题解 用到了二维hash,感觉和一维的不太一样. 对于列行有两个不同的进制数然后也是通过类似前缀和的方法差分出一个矩形的hash ...
- bzoj 1414: [ZJOI2009]对称的正方形 manacher算法+單調隊列
1414: [ZJOI2009]对称的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 331 Solved: 149[Submit][Stat ...
- BZOJ2351[BeiJing2011]Matrix——二维hash
题目描述 给定一个M行N列的01矩阵,以及Q个A行B列的01矩阵,你需要求出这Q个矩阵哪些在原矩阵中出现过.所谓01矩阵,就是矩阵中所有元素不是0就是1. 输入 输入文件的第一行为M.N.A.B,参见 ...
随机推荐
- Java设计模式之责任链模式、职责链模式
本文继续介绍23种设计模式系列之职责链模式. 什么是链 1.链是一系列节点的集合. 2..链的各节点可灵活拆分再重组. 职责链模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间 ...
- pycharm 使用技巧
格式化代码为pep8: ctrl+alt+l http://edu.51cto.com//index.php?do=lession&id=163794
- 《毛毛虫组》【Alpha】Scrum meeting 1
第一天 日期:2019/6/14 1.1 今日完成任务情况以及遇到的问题. 今日完成任务情况: (1)根据数据库设计时的E-R图将创建的表进行检查确保功能的正确实现. (2)进行公共类的设计,设计出程 ...
- 标签中的name属性和ID属性的区别
标签中的name属性和ID属性的区别 2018年05月13日 10:17:44 tssit 阅读数:760 编程这么久,细想了一下,发现这个问题还不是很清楚,汗!看了几篇文章,整理了一下,分享下! ...
- Js笔记-第17课
课 // 作业 //深度拷贝 var obj = { name:'rong', age:'25', card:['visa','alipay'], nam :['1','2','3','4','4'] ...
- 基于Nodejs的爬虫
简介 基于 Node.JS 爬取 博客园 1W+博文,对博文内容做关键词提取,生成词云. 演示 安装 安装 git.Node.JS.MongoDB.Yarn 克隆代码 git clone git@gi ...
- linux虚拟机配置网络
第一步.网络模式设置为桥接模式 第二步.设置ip和掩码 vim /etc/sysconfig/network-scripts/ifcfg-ens33 ens33为当前机器的网卡名称 在文件尾部添 ...
- QQ 发送邮件
之前也发布过一篇QQ发邮件的,后来那种方法在阿里云服务器中报错了,查了好久才发现,是阿里云的服务器把 25 端口 给封杀了.现在重新做了个功能. public static string UserNa ...
- 前端应该如何去认识http
大家应该都知道http是什么吧,肯定会回答不就是浏览器地址那东西吗,有啥好说的,接下来咱们来深入刨析下http这东西. 什么叫http:超文本传输协议(HTTP)是用于传输诸如HTML的超媒体文档的应 ...
- Docker 容器的网络连接 & 容器互联
1. Docker 容器网络基础架构 Docker0 ifconfig查看到的 docker0 是linux的虚拟网桥(OSI数据链路层) docker0 地址划分: 172.17.42.1 255. ...