[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

 

——代码

  1 #include <cstdio>
  2 #include <iostream>
  3 #define UI unsigned int
  4 
  5 const int MAXN = 2010, bs1 = 19260817, bs2 = 20011001;
  6 int n, m, ans;
  7 UI sum[4][MAXN][MAXN], base1[MAXN], base2[MAXN];
  8 
  9 inline int read()
 10 {
 11     int x = 0, f = 1;
 12     char ch = getchar();
 13     for(; !isdigit(ch); ch = getchar()) if(ch == '-') f = -1;
 14     for(; isdigit(ch); ch = getchar()) x = (x << 1) + (x << 3) + ch - '0';
 15     return x * f;
 16 }
 17 
 18 inline int min(int x, int y)
 19 {
 20     return x < y ? x : y;
 21 }
 22 
 23 inline bool pd(int x, int y, int l)
 24 {
 25     UI t, h;
 26     h = sum[0][x + l - 1][y + l - 1]
 27       -    sum[0][x - l][y + l - 1] * base1[l + l - 1]
 28       - sum[0][x + l - 1][y - l] * base2[l + l - 1]
 29       + sum[0][x - l][y - l] * base1[l + l - 1] * base2[l + l - 1];
 30     t = sum[1][x + l - 1][y - l + 1]
 31       - sum[1][x - l][y - l + 1] * base1[l + l - 1]
 32       - sum[1][x + l - 1][y + l] * base2[l + l - 1]
 33       + sum[1][x - l][y + l] * base1[l + l - 1] * base2[l + l - 1];
 34     if(h ^ t) return 0;
 35     t = sum[2][x - l + 1][y + l - 1]
 36       - sum[2][x + l][y + l - 1] * base1[l + l - 1]
 37       - sum[2][x - l + 1][y - l] * base2[l + l - 1]
 38       + sum[2][x + l][y - l] * base1[l + l - 1] * base2[l + l - 1];
 39     if(h ^ t) return 0;
 40     t = sum[3][x - l + 1][y - l + 1]
 41       - sum[3][x + l][y - l + 1] * base1[l + l - 1]
 42       - sum[3][x - l + 1][y + l] * base2[l + l - 1]
 43       + sum[3][x + l][y + l] * base1[l + l - 1] * base2[l + l - 1];
 44     if(h ^ t) return 0;
 45     return 1;
 46 }
 47 
 48 inline int work(int i, int j)
 49 {
 50     int mid, s = 0, x = 1, y = min(min(i, n - i + 1), min(j, m - j + 1));//二分半径 
 51     while(x <= y)
 52     {
 53         mid = (x + y) >> 1;
 54         if(pd(i, j, mid)) s = mid, x = mid + 1;
 55         else y = mid - 1;
 56     }
 57     return s;
 58 }
 59 
 60 int main()
 61 {
 62     int i, j, k, x;
 63     n = read();
 64     m = read();
 65     n = n << 1 | 1;
 66     m = m << 1 | 1;
 67     for(i = 2; i <= n; i += 2)
 68         for(j = 2; j <= m; j += 2)
 69         {
 70             x = read();
 71             for(k = 0; k < 4; k++) sum[k][i][j] = x;
 72         }
 73     base1[0] = base2[0] = 1;
 74     for(i = 1; i <= n; i++) base1[i] = base1[i - 1] * bs1;
 75     for(i = 1; i <= m; i++) base2[i] = base2[i - 1] * bs2;
 76     for(i = 1; i <= n; i++)
 77         for(j = 1; j <= m; j++)
 78             sum[0][i][j] += sum[0][i - 1][j] * bs1;
 79     for(i = 1; i <= n; i++)
 80         for(j = 1; j <= m; j++)
 81             sum[0][i][j] += sum[0][i][j - 1] * bs2;
 82     for(i = 1; i <= n; i++)
 83         for(j = m; j; j--)
 84             sum[1][i][j] += sum[1][i - 1][j] * bs1;
 85     for(i = 1; i <= n; i++)
 86         for(j = m; j; j--)
 87             sum[1][i][j] += sum[1][i][j + 1] * bs2;
 88     for(i = n; i; i--)
 89         for(j = 1; j <= m; j++)
 90             sum[2][i][j] += sum[2][i + 1][j] * bs1;
 91     for(i = n; i; i--)
 92         for(j = 1; j <= m; j++)
 93             sum[2][i][j] += sum[2][i][j - 1] * bs2;
 94     for(i = n; i; i--)
 95         for(j = m; j; j--)
 96             sum[3][i][j] += sum[3][i + 1][j] * bs1;
 97     for(i = n; i; i--)
 98         for(j = m; j; j--)
 99             sum[3][i][j] += sum[3][i][j + 1] * bs2;
100     for(i = 1; i <= n; i++)
101         for(j = 1; j <= m; j++)
102             if((i ^ j ^ 1) & 1)
103                 ans += work(i, j) >> 1;
104     printf("%d\n", ans);
105     return 0;
106 }
View Code

 

Manacher的话,学完再搞吧。

 

转载于:https://www.cnblogs.com/zhenghaotian/p/6863532.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/283598.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Semaphore详解

Semaphore基本使用场景 Semaphore的基本使用场景是限制一定数量的线程能够去执行. 举个简单的例子: 一个单向隧道能同时容纳10个小汽车或5个卡车通过(1个卡车等效与2个小汽车), 而隧道入口记录着当前已经在隧道内的汽车等效比重. 比如1个小汽车和1个卡车, 则隧道入口显示3. 若…

PerfView专题 (第六篇):如何洞察 C# 中 GC 的变化

一&#xff1a;背景 在洞察 GC 方面&#xff0c;我觉得市面上没有任何一款工具可以和 PerfView 相提并论&#xff0c;这也是为什么我会在 WinDbg 之外还要学习这么一款工具的原因&#xff0c;这篇我们先简单聊聊 PerfView 到底能洞察 GC 什么东西&#xff1f;二&#xff1a;洞察…

Linux_日志管理介绍(一)

一、介绍1、CentOS 6.x中日志服务已经由rsyslogd取代了原先的syslogd服务&#xff0c;但是rsyslogd是和syslogd服务相兼容的2、除了系统默认的日志之外&#xff0c;采用RPM方式安装的系统服务也会默认把日志记录在/var/log/目录中&#xff08;源码包安装的服务日志是在源码包指…

如何将exe文件添加到开机启动

1、先创建exe文件的快捷方式 2、打开windows的startup启动目录&#xff08;针对win10以上&#xff09; windows有两个以上startup目录&#xff0c;一个是针对所有用户有效的&#xff0c;另外是每个用户下边有一个&#xff1a; 针对当前用户 &#xff1a; C:\Users\{当前用户}\A…

mysql重连,连接丢失:The last packet successfully received from the server--转载

1.1 错误信息&#xff1a; Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 20,820,001 milliseconds ago. The last packet sent successfully to the server was 20,820,002 milliseconds…

.NET MAUI 跨平台应用程序 (Windows App 和 Android )示例

也就前周&#xff0c;.Net MAUI正式版出来了 &#xff0c;一个支持跨平台的UI框架,Linux支持情况官网也没说&#xff0c;按理来说应该也是支持的&#xff0c;刚好&#xff0c;我最近也在研究GUI的基本原理&#xff0c;微软出品还是值得深入研究一下的&#xff0c;就先来个样例&…

OpenStack 计算节点删除

前提 计算节点中一个僵尸计算节点存在&#xff0c;而里面的CPU数目在总物理CPU中&#xff0c;导致认为当前能创建实例。而实际没有这么多资源。其中node-11为僵尸节点。 原因 删除计算节点不能直接格式化该服务器&#xff0c;否则在控制节点的数据库上会存在该计算节点的数据。…

PHP 7.2 新功能介绍

PHP 7.2 已經在 2017 年 11 月 30 日 正式發布 。這次發布包含新特性、功能&#xff0c;及優化&#xff0c;以讓我們寫出更好的代碼。在這篇文章裡&#xff0c;我將會介紹一些 PHP 7.2 最有趣的語言特性。 你可以在 Requests For Comments 頁面查看完整的更動清單。 核心改进 参…

C盘空间不够 mklink解决VScode扩展迁移到其他盘

第一步 将C盘C:\Users\JackieZheng\.vscode文件夹剪切到D:\vscode中去 第二步 以管理员身份运行cmd&#xff0c;执行如下命令&#xff0c;建立符号链接在管理员身份下的cmd中输入如下命令 mklink /D "C:\Users\JackieZheng\.vscode" "D:\vscode\.vscode" 两…

如何打造单文件 Blazor Server 应用

前言上次&#xff0c;我们介绍了《如何打造单文件前后端集成 ASP.NET Core 应用》。但是&#xff0c;网友说&#xff0c;对于 Blazor Server 项目此方法无效。于是&#xff0c;我们测试了一下&#xff1a;BlazorApp1.csproj<Project Sdk"Microsoft.NET.Sdk.Web"&g…

正则化笔记

吉谱斯现象Gibbs&#xff08;又叫吉谱斯效应&#xff09;&#xff1a; 用有限项傅里叶级数表示有间断点的信号时&#xff0c;在间断点附近不可避免的会出现振荡和超量。超量的幅度不会随所取项数的增加而减小。只是随着项数的增多&#xff0c;振荡频率变高&#xff0c;并向间断…

Android线程池详解

引入线程池的好处 1&#xff09;提升性能。创建和消耗对象费时费CPU资源 2&#xff09;防止内存过度消耗。控制活动线程的数量&#xff0c;防止并发线程过多。 我们来看一下线程池的简单的构造 [html] view plaincopy print?public ThreadPoolExecutor(int corePoolSize, …

win11下vscode 自动升级失败 There was an error while marking a file for deletion

当升级vscode时出现下方报错&#xff1a; There was an error while marking a file for deletion:Failed to mark file for deletion:拒绝访问.Please verify there are no Visual Studio Code processes still executing既然是“拒绝访问”应该是权限问题&#xff0c;关闭vsc…

MySQL添加新用户、为用户创建数据库、为新用户分配权限

https://blog.csdn.net/u013216667/article/details/70158452 登录MySQL mysql -u root -p 添加新用户 允许本地 IP 访问 localhost, 127.0.0.1 create user testlocalhost identified by 123456;允许外网 IP 访问 create user test% identified by 123456; 刷新授权 flush p…

【mysql必知必会】第十二章 汇总数据

1、聚集函数&#xff08;aggregate function&#xff09;&#xff1a;运行在行组上&#xff0c;计算和返回单个值得函数。 AVG&#xff08;&#xff09;  返回某列的平均值 COUNT&#xff08;&#xff09;  返回某列的行数 MAX&#xff08;&#xff09;  返回某列的最大值…

盘点大厂的那些开源项目 - 哔哩哔哩

哔哩哔哩现为中国年轻世代高度聚集的文化社区和视频平台&#xff0c;被粉丝们亲切地称为“B站”。overlord分类&#xff1a;缓存服务解决方案开发语言&#xff1a;GOOverlord是哔哩哔哩基于Go语言编写的memcache和redis&cluster的代理及集群管理功能&#xff0c;致力于提供…

单元测试,到底什么是单元测试,为什么单测这么难写

很多小伙伴想知道单测到底该怎么写&#xff0c;于是&#xff0c;文章就来了&#xff01; 话不多说&#xff0c;发车&#xff01; 来源于yes的练级攻略 &#xff0c;作者是Yes呀 到底什么是单元测试 这个问题看似非常简单&#xff0c;单元测试嘛&#xff0c;不就是咱们开发自己…

javascriptjquery 判断滚动到页面底部

js 判断滚动到页面底部 CreateTime--2018年4月14日10:13:07 Author:Marydon 1.使用场景&#xff1a; 滚动到屏幕底部&#xff0c;触发加载分页数据请求&#xff08;qq空间&#xff0c;手机端&#xff09; 2.代码实现 javascript方式 window.onscroll function() {//获取被卷…

Linux 学习和教训

今天在学习Linux的时候&#xff0c;突然脑抽风&#xff0c;在根目录下执行了这样一条命令rm -rf *当时就觉得空气凝固了。。。那时也没有想到可以用数据恢复软件恢复。直接就重启了。重启之后发现&#xff0c;就去就直接是grub>晕菜。。突然间想到可以时候救援模式&#xff…

WinForm(八)窗体,窗体

我们在控件那篇文章里说过&#xff0c;窗体和控件都是一个类&#xff0c;项目中一个个窗体&#xff0c;都是Form类的子类。关于这个类有几个重要的成员&#xff0c;也是最常用成员&#xff0c;以供初学者了解&#xff1a;Load事件&#xff1a;发生在构造函数后&#xff0c;Show…