[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…

.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 頁面查看完整的更動清單。 核心改进 参…

如何打造单文件 Blazor Server 应用

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

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…

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

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

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

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

Linux 学习和教训

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

WinForm(八)窗体,窗体

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

java8

实验总结 没问题 代码托管 https://git.oschina.net/shuoge/java8 转载于:https://www.cnblogs.com/haha-23333/p/6875325.html

抓包工具fiddler和wireshark对比

了解过网络安全技术的人都知道一个名词“抓包”。那对于局外人&#xff0c;一定会问什么是抓包&#xff1f;考虑到&#xff0c;大家的技术水平不一&#xff0c;我尽可能用非专业的口吻简单的说一下。 抓包就是将网络传输发送与接收的数据包进行截获、重发、编辑、转存等操作&am…

你被大数据“杀熟”过吗?怎么解决的?丨Q言Q语

点击关注 InfoQ&#xff0c;置顶公众号 接收程序员的技术早餐网友“廖师傅廖师傅”表示&#xff0c;他经常通过某网站订某个特定酒店的房间&#xff0c;长年价格在 380 元 -400 元。偶然一次&#xff0c;他从前台得知酒店淡季的价格在 300 元上下。他用朋友的账号查询也是 300 …

Blazor VS Vue

Vue——两分钟概述Vue 是一个JavaScript 框架。在其最简单的模式中&#xff0c;您可以简单地将核心 Vue 脚本包含在您的应用程序中&#xff0c;然后开始构建您的组件。除此之外&#xff0c;对于更复杂的应用程序&#xff0c;您可以使用 Vue 自己的 CLI 创建&#xff08;并最终发…

SAP ECC EHP7 RFC 发布成WebService

http://www.cnblogs.com/mingdashu/p/6877622.html 1、说明介绍 本文将RFC发布成WebService的详细步骤 不介绍如何创建rfc。 2、WebService创建 2.1、调用创建命令 在RFC界面点击 实用程序-->更多实用程序-->创建WEB服务-->来自函数模块 2.2、定义Web Service 2.2.1、…

一文把RabbitMQ讲透了,佩服!

目录 背景 消息队列 | 消息队列模式 ①点对点模式 ②发布/订阅模式 | 衡量标准 RabbitMQ 原理初探 | 基本概念 | 工作原理 | 常用交换器 | 消费原理 | 高级特性 ①过期时间 ②消息确认 ③持久化 ④死信队列 ⑤延迟队列 | 特性分析 RabbitMQ 环境搭建 Rabbi…