题目

题目背景
“真是太奇怪了,” OneInDark\sf OneInDarkOneInDark 对 OL⁣lYE\sf OL\!lYEOLlYE 说,“我去问炎翼鸟和 Dd(XyX)\sf Dd(XyX)Dd(XyX) 谁把我卷飞了,他们都说不是他。”

“这好办。” OL⁣IYE\sf OL\!IYEOLIYE 说完,便去找他们各谈了一次话,然后回来说:“我告诉他们,如果他们不说是谁,我卷爷就把他们卷飞;现在他们都承认是自己把你卷飞了。”

题目描述
给定 010101 串 SnS_nSn​,其长度为 nnn 。求有多少个不同的 010101 串的序列 {S1,S2,…,Sn−1}\{S_1,S_2,\dots,S_{n-1}\}{S1​,S2​,…,Sn−1​} 满足 Si(1⩽i<n)S_i\;(1\leqslant i<n)Si​(1⩽i<n) 是 Si+1S_{i+1}Si+1​ 的子序列且 ∣Si∣=i|S_i|=i∣Si​∣=i 。

数据范围与约定
n⩽2.5×105n\leqslant 2.5\times 10^5n⩽2.5×105 。

思路

等价于每次删掉一个字符。为避免重复,规定删掉的字符必须与下一个字符不同(或者是末尾字符)。

只与相邻元素有关,考虑区间 dp\tt dpdp 。记 f(l,r,v)(v∈{0,1})f(l,r,v)\;(v\in\{0,1\})f(l,r,v)(v∈{0,1}) 为,删去 [l,r][l,r][l,r] 内元素,且最后一个删去的元素不是 vvv 的方案数。有转移 f(l,r,v)=∑i=lr[ci≠v]f(l,i−1,v⊕1)f(i+1,r,v)(r−li−l)f(l,r,v)=\sum_{i=l}^{r}[c_i\ne v]f(l,i{-}1,v{\oplus}1)f(i{+}1,r,v){r-l\choose i-l}f(l,r,v)=∑i=lr​[ci​​=v]f(l,i−1,v⊕1)f(i+1,r,v)(i−lr−l​) 。只能做到 O(n3)\mathcal O(n^3)O(n3) 。

好的问题转化胜过万种优化。这也正是我只能永远地膜拜 OUYE\sf OUYEOUYE 的原因。我们换一种约定:删去 0 时,后一个数字必须是 1,而删去 1 时前一个数需为 0 。假设第 000 个字符是 0,第 (n+1)(n{+}1)(n+1) 个字符是 1,便无特例。此时,操作相当于 将某个 010101 变为 0/10/10/1 。

至此,我们还看不出什么。离谱的要来了:为了监视 010101 的连通情况,我们放一个 辅助元素 μi(0⩽i⩽n)\mu_i\;(0\leqslant i\leqslant n)μi​(0⩽i⩽n) 在第 iii 个字符和第 (i+1)(i{+}1)(i+1) 个字符之间。对某个 010101 进行操作时,我们将二者之间的辅助元素也删去。不难发现任意时刻原串都是 01 与辅助元素交错的。

结论出现了:若 ci=0c_i=0ci​=0,则 μi\mu_iμi​ 比 μi−1\mu_{i-1}μi−1​ 更早删除,反之则更晚。必要性是显然的。而这里实际上有两个命题,二者互为否命题;所以其逆命题成立,即该约束也是充分的。

无论是将操作局限于 010101 之上,还是添加辅助元素 μi\mu_iμi​,我都不可能想到!我本发了宏愿,想要将此题做出;人类的力量太过 弱小,不依靠 Dd(XyX)\sf Dd(XyX)Dd(XyX) 我永远也做不到!

而 μi\mu_iμi​ 的删除顺序唯一确定序列——删除 μi\mu_iμi​ 时,究竟是删 0 还是删 1 是可知的:本次操作后,原本 0 左侧的 μl\mu_lμl​ 和 1 右侧的 μr\mu_rμr​ 会相邻。那么二者的删除顺序就会告诉我们,中间夹着 0 还是 1,这也就是剩下的元素。

所以此题等同于经典老题不等关系,无非加了几个 ? 罢了。而 ? 相当于没有限制,所以两侧独立;按照 ? 切开,每个子段独立算就行了。时间复杂度 O(nlog⁡2n)\mathcal O(n\log^2 n)O(nlog2n) 。如果半在线卷积,可以 O(nlog⁡2nlog⁡log⁡n)\mathcal O({n\log^2 n\over\log\log n})O(loglognnlog2n​),但那也太毒瘤了

[ACNOI2022]零一串相关推荐

  1. C语言:零幺串(N0为最大连续零串的个数,N1为最大一串的个数)

    注:如果看不懂代码的作用,可以手动模拟一下该程序的执行过程 #include<stdio.h> #include<string.h> int main() {char str[ ...

  2. 数据结构复习-基础、线性表、栈、队列、串

    数据结构复习笔记 作者: 收集于网络 第一章:概论 数据:指所有能被输入到计算机中,且能够被计算机识别.存储和加工处理的信息的载体,是计算机操作的对象的总称. 数据元素:数据的基本单位,有时一个数据元 ...

  3. c语言word类型_C语言零基础入门—数据类型

    ​C语言零基础入门--3.数据类型 这一节的主要任务是 讲解C语言的 数据类型 . 1. 数据类型 1.1 何为数据类型 数据类型,其实在我们生活中经常被使用,但是在编程语言中被重新定义了一下,并且加 ...

  4. 数据结构与算法:13 字符串与整数集合

    13 字符串与整数集合 知识点: 1. 字符串 我们古人没有电影电视,没有游戏网络,所以文人们就会想出一些文字游戏来娱乐.比如宋代的李禺写了这样一首诗:"枯眼望遥山隔水,往来曾见几心知?壶空 ...

  5. 我学Delphi心得及笔记----字符串操作(第六讲)

    Delphi 中字符串的操作很简单,但幕后情况却相当复杂.Pascal 传统的字符串操作方法与Windows 不同,Windows吸取了C语言的字符串操作方法.32位Delphi中增加了长字符串类型, ...

  6. 单片机中存储器扩展位地址线怎么算_51单片机CPU结构各部件的原理详细分析

    一. 51单片机串行口工作原理 MCS-51系列单片机片内有一个串行I/O端口,通过引脚RXD(P3.0)和TXD(P3.1)可与外设电路进行全双工的串行异步通信. 1.串行端口的基本特点 8031单 ...

  7. [SDOI2017]遗忘的集合

    题面 DP学得好好的为什么突然想起写多项式呢? 这要从几天前说起 一开始是看到一道FWT的DP([SNOI2017]遗失的答案) 然后在洛谷上搜 没有搜到 但是搜到了这个题 仔细一看 MTT+莫比乌斯 ...

  8. PostgreSQL 10.1 手册_部分 IV. 客户端接口_第 33 章 libpq - C 库_33.13. 事件系统

    33.13. 事件系统 33.13.1. 事件类型33.13.2. 事件回调函数33.13.3. 事件支持函数33.13.4. 事件实例 libpq的事件系统被设计为通知已注册的事件处理器它感兴趣的l ...

  9. [转]Windows Shell 编程 第八章 【来源:http://blog.csdn.net/wangqiulin123456/article/details/7987961】...

    第八章 程序执行器 在Windows95以后,文档的概念得到了进一步增强.这隐含地说,文档不仅仅是ASCII文档,也不仅仅是Word或Excel文件,'文档'在这里的意思是更广泛的对象,它是系统命名空 ...

最新文章

  1. 面试官:你们Redis故障过吗,怎么解决?
  2. Spring Cloud Alibaba基础教程:Sentinel使用Apollo存储规则
  3. python 栈的压入弹出序列
  4. 《ASP.NET Core 微服务实战》-- 读书笔记(第5章)
  5. Java变异出现错误:No enclosing instance of type XXX is accessible
  6. 路由器的分组转发算法
  7. IDEA设置生成带注释的getter和setter解决方案 (图文教程)
  8. 【转载】哇!!!这个真的是我见过最全的端口介绍了
  9. 写给一些想创业的和在打工路上的人
  10. linux cpu bench,Linux下一种简单易行的cpu benchmark方法
  11. Mac os X 常用技巧
  12. 一个比较稳定的PLC通讯模块设计
  13. 读书笔记:程序员的数学 概率统计
  14. 二叉树前序遍历执行过程
  15. Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile Could not retrie
  16. 智能手机是如何迭代的?消除鱼龙混杂珠虐待
  17. HTTP协议的请求格式解析
  18. 在widows下使用ioperm控制端口
  19. 击鼓传花java_击鼓传花联想到了Java设计模式:责任链模式
  20. 谨以此文纪念自己那曾经的魔兽岁月

热门文章

  1. apprtcH5+iOS+android音视频通信
  2. 淘宝代购系统|代购网站建设|代购系统开发代码对接教程
  3. matlab让一个点变为指定颜色,MATLAB中的颜色控制
  4. En-Tan-Mo(ETM)项目周报(8.2-8.8)
  5. java 每3秒执行一次_@Schedule注释每隔几分钟(或几秒钟)运行一次
  6. 学习matlab(四)——概率与数理统计
  7. async.js 学习教程(一)
  8. SQL中的case when函数使用
  9. 5种创建Dataframe方法
  10. iOS的三种常见计时器(NStimer、CADisplayLink、dispatch_source_t)的使用