P3501 [POI2010] ANT-Antisymmetry 反对称 题解(字符串哈希+二分)

原题

题意

若一个由 01 01 01组成的字符串将 0 0 0 1 1 1取反,并倒过来后与原字符串相同,则称为反对称字符串。现在给你一个长度为 n ( n ≤ 1 0 5 ) n(n \le 10^5) n(n105) 01 01 01组成的字符串,求它有多少个反对称子串。(两个子串只要起始位置不同或长度不同就算做两个子串,即使子串的内容相同)

样例

8
11001011
7

思路

本文没有详细讲解字符串哈希的实现,不会戳这里

朴素

先预处理出原字符串的 H a s h Hash Hash数组和原字符串 01 01 01取反并前后颠倒的 H a s h Hash Hash数组,然后枚举每个子串,判断两个 H a s h Hash Hash是否相等,计数。复杂度 O ( n 2 ) O(n^2) O(n2),喜提TLE。

进阶

(此时我偷偷看了一下题目的标签,要用二分) 先考虑如何构造一个反对称字符串,如果没有“反”,那么就是回文串,很明显,是从中间开始,向两边扩展,对应位置的 01 01 01相同,例如: 01010 01010 01010 11100111 11100111 11100111。但是要分成两种情况,奇数长度的字符串和偶数长度的字符串构造方法略有不同。可是有“反”,也就是说对应位置不是相同,而是相反。带到样例里算一下,比如说 001011 001011 001011,构造过程如下: 10 10 10 -> 0101 0101 0101 -> 001011 001011 001011。进一步发现,每一步都会构成一个反对称字符串,这就给二分提供了基础。

实现

可以枚举每个反对称子串中间两个位置的右边那个(这里需要注意一个细节,其实完全不用分两种情况,因为对应位置的字符不同,如果长度是奇数,中间的字符不可能和自己不同,所以长度只能是偶数),用二分找到最大的反对称字符串长度(实际的长度是 2 ⋅ m i d 2·mid 2mid,这里枚举半边的长度),判断时看 i − m i d i-mid imid i + m i d − 1 i+mid-1 i+mid1的子串是否是反对称串,如果是,就可以继续扩大长度判断,如果不是,由于中心确定,已经发现对应位置上的字符相同,不符合要求,再向两边扩大长度也不会成为反对称串,所以缩小长度。最后计数器加上的值是 r r r,以 i i i为中心,长度是 2 2 2 2 r 2r 2r中的偶数都是符合标准的。

代码

(本人为了保险,写了两个哈希表,其实一个也能过)

#include<bits/stdc++.h>
using namespace std;
#define mod1 1000000007
#define mod2 1000000009
#define mul 2
int n,a[500005];
long long h1[500005],h2[500005],g1[500005],g2[500005];
//h是原字符串,g是取反翻转后的
long long m1[500005],m2[500005],ans;
char s[500005];
int main(){scanf("%d%s",&n,s+1);m1[0]=m2[0]=1;for(int i=1;i<=n;i++) m1[i]=m1[i-1]*mul%mod1;for(int i=1;i<=n;i++) m2[i]=m2[i-1]*mul%mod2;for(int i=1;i<=n;i++) h1[i]=(h1[i-1]*mul%mod1+(s[i]=='1'))%mod1;for(int i=1;i<=n;i++) h2[i]=(h2[i-1]*mul%mod2+(s[i]=='1'))%mod2;for(int i=n;i>=1;i--) g1[i]=(g1[i+1]*mul%mod1+(s[i]=='0'))%mod1;for(int i=n;i>=1;i--) g2[i]=(g2[i+1]*mul%mod2+(s[i]=='0'))%mod2;for(int i=1;i<=n;i++){int l=1,r=min(i-1,n-i+1),flag=0;while(l<=r){int mid=(l+r)/2;int t1=(h1[i+mid-1]-h1[i-mid-1]*m1[2*mid]%mod1+mod1)%mod1,t2=(h2[i+mid-1]-h2[i-mid-1]*m2[2*mid]%mod2+mod2)%mod2,tt1=(g1[i-mid]-g1[i+mid]*m1[2*mid]%mod1+mod1)%mod1,tt2=(g2[i-mid]-g2[i+mid]*m2[2*mid]%mod2+mod2)%mod2;if(t1==tt1&&t2==tt2) l=mid+1,flag=1;else r=mid-1;}ans+=r;}printf("%lld\n",ans);return 0;
}

附赠如何见到祖宗的指南:
在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Prometheus-部署

Prometheus-部署 Server端安装配置部署Node Exporters监控系统指标监控MySQL数据库监控nginx安装grafana Server端安装配置 1、上传安装包&#xff0c;并解压 cd /opt/ tar xf prometheus-2.30.3.linux-amd64.tar.gz mv prometheus-2.30.3.linux-amd64 /usr/local/prometheus…

npm install报错原因记录:npm ERR! code ENOENT

报错原因&#xff1a;路径打开错了&#xff0c;你需要在package.json这个文件的文件夹目录打开终端执行命令才行。 比如我的前端项目中&#xff0c;package.json项目在back-system-font-ts文件下&#xff0c;我就需要右击该文件&#xff0c;从该目录打开终端才有用

【前端】(仅思路)如何在前端实现一个fc手柄,将手机作为游戏手柄设备。

文章目录 背景界面demo遇到的问题最终后端demo(甚至比前端逻辑更简单) 背景 突发奇想&#xff0c;想要在前端实现一个fc游戏手柄&#xff0c;然后控制电脑的nes模拟器玩玩魂斗罗。 思路很简单&#xff0c;前后端使用websocket通信&#xff0c;connected标识socket链接已建立&a…

【Vulnhub系列】Vulnhub_Dr4g0n_b4ll 靶场渗透(原创)

【Vulnhub系列靶场】Vulnhub_Dr4g0n_b4ll靶场渗透 原文转载已经过授权 原文链接&#xff1a;Lusen的小窝 - 学无止尽&#xff0c;不进则退 (lusensec.github.io) 一、环境搭建 选择打开.ovf 文件 配置名称和路径 打开后调整网络连接模式为【NAT】即可 二、信息收集 1、主机…

RTC实时通信技术:GPT-4o急速响应背后的技术浅谈

RTC实时通信技术&#xff1a;GPT-4o急速响应背后的技术浅谈 RTC实时通信技术概述 RTC&#xff08;Real Time Communication&#xff09;&#xff0c;即实时通信技术&#xff0c;是实时音视频通信的简称。其核心在于实现低延迟、高质量的音视频数据传输和处理&#xff0c;广泛…

2024华为数通HCIP-datacom最新题库(H12-831变题更新⑧)

请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 请注意&#xff0c;华为HCIP-Datacom考试831已变题 近期打算考HCIP的朋友注意了&#xff0c;如果你准备去考试&#xff0c;还是用的之前的题库&#xff0c;切记暂缓。 1、…

2024-7-28-CAJ转换器

&#x1f37f;*★,*:.☆(&#xffe3;▽&#xffe3;)/$:*.★* &#x1f37f; &#x1f4a5;&#x1f4a5;&#x1f4a5;欢迎来到&#x1f91e;汤姆&#x1f91e;的csdn博文&#x1f4a5;&#x1f4a5;&#x1f4a5; &#x1f49f;&#x1f49f;喜欢的朋友可以关注一下&#xf…

敏捷产品经理实训:助力产品负责人掌握敏捷方法,提升产品开发效率

在当今快节奏的市场环境中&#xff0c;产品经理和产品负责人需要快速响应市场变化&#xff0c;推动产品创新&#xff0c;以满足用户不断变化的需求。敏捷产品经理实训课程专为产品经理和产品负责人设计&#xff0c;旨在帮助他们掌握敏捷方法&#xff0c;提高团队协作和产品开发…

16 CFR 1236婴儿睡眠产品出口美国认证标准CPC认证ASTM F3118测试

美国消费品安全委员会 (CPSC) 在联邦公报上发布了最终规则(86 FR 33022) 建立婴儿睡眠产品的强制性安全标准&#xff1a;婴儿睡眠产品安全标准&#xff08;16 CFR part 1236), 该安全标准是参考了ASTM F3118-17a。16 CFR part 1236对 2022 年 6 月 23 日或之后生产的产品生效。…

哪些牌子充电宝性价比比较高?目前公认比较好用充电宝都在这儿!

在这个科技飞速发展的时代&#xff0c;充电宝已经成为我们生活中不可或缺的一部分。然而&#xff0c;在享受充电宝带来的便利时&#xff0c;我们不能忽视一个至关重要的问题——安全性。随着无线充电宝的普及&#xff0c;大家对于“无线充电宝哪个牌子更好&#xff1f;”的疑问…

我的「Java全栈高级架构师高薪就业课」适合什么样的人群学习?

我的《Java全栈高级架构师高薪就业课》上线了~ 这是一套Java全栈微服务架构、以实战项目驱动的课程&#xff01;包含34个模块&#xff0c;1514课时。对标阿里P7级别技术栈而研发&#xff0c;有着循序渐进的学习体系&#xff0c;助你开启Java进阶之旅。 我的这套《Java全栈高级…

linux系统时间切片时长问题。

&#x1f3c6;本文收录于《CSDN问答解惑-专业版》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收…

【Windows下搭建本地数据库】使用 phpStudy 快速搭建本地数据库

一、下载 phpStudy 1、官网下载 小皮面板(phpstudy) - 让天下没有难配的服务器环境&#xff01; 2、下载所需对应版本&#xff0c;无对应版本&#xff0c;就下最新版 3、下载64位的&#xff0c;电脑现在都是64位的 4、安装即可。 二、搭建本地数据库 1、打开皮皮 2、点击设置…

php yii2 foreach中使用事务,事务中使用了 continue

问题描述&#xff1a;使用yii2&#xff0c;在foreach中使用事务&#xff0c;每个循环一个事务&#xff0c;在事务进行判断,然后直接continue,导致后面的循环数据没有保存成功 如下图&#xff1a; 修改后&#xff1a;如下图

Java每日一练,技术成长不间断

目录 题目1.下列关于继承的哪项叙述是正确的&#xff1f;2.Java的跨平台特性是指它的源代码可以在多个平台运行。&#xff08;&#xff09;3.以下 _____ 不是 Object 类的方法4.以下代码&#xff1a;5.下面哪个流类不属于面向字符的流&#xff08;&#xff09;总结 题目 选自牛…

Word中的希腊字符和常用字符对应的字符代码

问题描述&#xff1a; 每次想要论文word中&#xff0c;插入某些符号&#xff0c;找这些符号太费时间了&#xff0c;于是想着把一些常用的符号列写出来&#xff0c;方便后续查找。 通过查找下面想要插入的符号&#xff0c;选择字符代码插入即可。 symbol字体下 α \alpha α&a…

牛客JS知识题库解析(一)

目录 一、call和apply知识点 二、数组concat连接方法 三、call和apply与concat连用 四、正则表达式 五、match方法 六、数据类型 七、逗号表达式 八、toStirng()方法 九、&&和>符号的权重 总结 一、call和apply知识点 call和apply都会自动调用前面的函数&#xff0…

短链接假量过滤:让推广数据回归真实

在当今互联网技术飞速发展与普及的时代&#xff0c;数字营销已然成为企业推广的关键利器&#xff0c;而短链接在其中更是扮演着不可或缺的角色。它能把冗长、复杂的 URL 巧妙转化为简短且易记的链接&#xff0c;极大地便利了分享和传播。 就拿某公司新上市一款产品来说&#x…

数学规划模型★★★★★

该博客为个人学习清风建模的学习笔记&#xff0c;代码全部摘自清风老师&#xff0c;部分课程可以在B站&#xff1a;【强烈推荐】清风&#xff1a;数学建模算法、编程和写作培训的视频课程以及Matlab等软件教学_哔哩哔哩_bilibili 目录 1概述 1.1什么是数学规划 1.2数学规划…

Java高并发编程详解教程(对高并发更深一层的领悟和体会 电子版)

前言 第一部分主要阐述Thread的基础知识&#xff0c;详细介绍线程的API使用、线程安全、线程间数据通信以及如何保护共享资源等内容&#xff0c;它是深入学习多线程内容的基础。 在第二部分中之所以引人 ClassLoader&#xff0c;是因为 ClassLoader 与线程不无关系&#xff0…