[AGC066C] Delete AAB or BAA
\(\mathbf{Part.-1}\)
给定一个由字符 A 和 B 组成的字符串 \(S\) 。
在这根绳子上,您可以反复执行以下操作:
在字符串 \(S\) 中选择三个连续且相等的字符,这些字符要么是 AAB 要么是 BAA,然后将这三个字符从 \(S\) 中删除(删除后,剩余的字符会连接在一起)。
找出能执行此操作的最大次数。
给出 \(T\) 个测试用例;请分别求解。
\(\mathbf{Part. 0}\)
初始对题目结构的观察是重要的。
这题有两个显然的方向:
- 考虑
A和B的连通块 - 考虑操作区间的性质
对于第一种,它很可做,但是就是做不出来。
对于第二种,我们称一个操作 AAB 和 BAA 的操作区间 \([i, j]\) 为这三个字符在原字符串上最左边到最右边的区间。1
由于删除的三个字符是连续的,所以操作区间一定不会相交。因此,操作区间是嵌套的4。所以操作序列构成笛卡尔树的形式。
\(\mathbf{Part. 1}\)
我们先从简单的情况入手,考虑如何判断整个序列都能被消除。
首先,以 A,B 个数为观察对象。容易发现,B 的个数一定要等于 \(\dfrac{n}{3}\)。2
继续从简单的情况入手,由 \((1)\),考虑观察一个操作区间。对于一个操作区间 \([i, j]\),首先它一定要满足 \((2)\)。然后,我们发现最后一步的消除 \((i, x, j)\) 一定是以 \(i\) 开头,\(j\) 结尾的。又因为只有 AAB 和 BAA 的三个数可以消除,所以 \(x\) 一定为 A,\(i, j\) 一定分别为 AB 或 BA。3
考虑回到整个序列。我们现在知道了操作区间有性质,再考虑整个序列,我们容易发现它能被分成若干个操作区间。
因此,我们有两个必要条件:
- 由 \((2)\),
B的个数一定要等于 \(\dfrac{n}{3}\)。 - 把整个序列划分成若干个区间,对于每一个区间,我们都要满足:
- 由 \((2)\),
B的个数一定要等于 \(\dfrac{len}{3}\)。 - 由 \((3)\),开头和结尾一定有一个
A一个B。
- 由 \((2)\),
\(\mathbf{Part. 2}\)
发现这个形式很归纳啊!而且如果这两个性质就是充分的话,就很舒服了。
我们可以尝试构造这样的不满足的情况,但你发现构造不出来。那能不能证?
事实上是可以的。由 \((4)\),操作区间实际上是嵌套的,每个操作区间都可以被分成多个小的操作区间。因此考虑归纳。
- 长度为 \(3\) 时,结论显然。
- 当长度为 \(len\) 时,我们容易发现存在长度 \(\geq 2\) 的
A连续段。由于总共B的个数 \(\geq 2\),显然可以找到连续段的一段删除AAB或BAA后仍保证开头和结尾为A和B。
因此,我们成功知道了一个序列全部消除的充要条件。
于是,接下来靠题感都能做了。我们直接考虑 \(f_x\) 表示前 \(x\) 个字符,最少留下几个。转移是枚举 \(1 \leq j < x\),然后判断 \([j + 1, x - 1]\) 能否全部消除。这是朴素的。
\(\mathbf{Part. +\infin}\)
以下是我自己的思考。显然,拿到一道题的第一感觉对于结论题来说十分重要。
这道题操作的结构是什么?对于每个连通块,操作一定发生在连通块的边界处。这是对的,也可以继续往下做,但是够深刻吗?
我们发现,如果一个连通块消失了,两边的连通块会合并,这不好刻画。
更加深刻的理解是:对于每一个操作,它组成的 \([l, r]\) 一定是嵌套的,呈现笛卡尔树的形式。
这个理解完全包含了连通块的理解,而且更加可做。这也不是特别难想,但是为什么我们想不到?或者说,为什么我们不会往这个方向想。
事实上,一道题的正确做法是线性的,是一条链,但是可能的所有解法构成一颗树。然而,我们的思维也是线性的,而且我们会讨厌推翻前面的一切做法,重新再来。
这是我们要跳脱出来的点。
[AGC066C] Delete AAB or BAA的更多相关文章
- NOIP2015 子串
#149. [NOIP2015]子串 有两个仅包含小写英文字母的字符串 AA 和 BB. 现在要从字符串 AA 中取出 kk 个互不重叠的非空子串,然后把这 kk 个子串按照其在字符串 AA 中出现的 ...
- UOJ149 【NOIP2015】子串
本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转载请注明出处,侵权必究,保留最终解释权! [问题描述]有两个仅包含小写英文字母的字符串 A ...
- ACM题目————Anagram
Description You are to write a program that has to generate all possible words from a given set of l ...
- CodeForces 152C Pocket Book
Time Limit:2000MS Memory Limit:262144KB 64bit IO Format:%I64d & %I64u Submit Status Prac ...
- 【NOIP2015】提高day2解题报告
题目: P1981跳石头 描述 一年一度的“跳石头”比赛又要开始了!这项比赛将在一条笔直的河道中进行,河道中分布着一些巨大岩石.组委会已经选择好了两块岩石作为比赛起点和终点.在起点和终点之间,有 N ...
- 4560 NOIP2015 D2T2 子串
4560 NOIP2015 D2T2 子串 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 有两 ...
- CodeForces152C——Pocket Book(排列组合问题)
Pocket Book DescriptionOne day little Vasya found mom's pocket book. The book had n names of her fri ...
- POJ1671 动态规划
POJ1671 问题重述: 本题求解一首N行诗可能的押韵结构的数目.所谓押韵结构,指的是指定的行数之间必须押韵.例如一首3行诗的押韵结构可以是aaa, aab, aba, baa, abc 5种(aa ...
- 【NOIP2015】字串
[NOIP2015]字串 标签: DP NOIP Description 有两个仅包含小写英文字母的字符串 A 和 B.现在要从字符串 A 中取出 k 个互不重叠的非空子串,然后把这 k 个子串按照其 ...
- crunch--字典生成工具
Crunch是一种创建密码字典工具,按照指定的规则生成密码字典,可以灵活的制定自己的字典文件.使用Crunch工具生成的密码可以输出到屏幕,保存到文件.或另一个程序.crunch程序在2004年及以前 ...
随机推荐
- Vue 3中的ref和template refs详解(含Vue2迁移到Vue3方法)
Vue 3中的ref和template refs详解 在Vue 3中,ref和模板引用(template refs)是两个相关但不同的概念,它们在组合式API(Composition API)中扮演着 ...
- .NET+AI | eShopSupport 知多少
eShopSupport 项目深度解析 eShopSupport 项目的整体架构示意图.左侧为离线运行的工具(DataGenerator.DataIngestor.Evaluator)用于数据准备和评 ...
- 0x01 - 我的第一个 Object Visitor
我的第一个 Object Visitor 预演准备 为了顺利的进行测试,你需要确保本地已经安装了以下这些必备的软件: dotnet 2.1 或者以上版本的 SDK,我们更建议直接安装 dotnet 5 ...
- 462.Minimum Moves to Equal Array Elements II——LeetCode进阶路
原题链接https://leetcode.com/problems/minimum-moves-to-equal-array-elements-ii/ 题目描述 Given a non-empty i ...
- ODOO14修改源生的图标
第一步:在公司模型界面:拥有权限组:groups="base.group_no_one" 的人可以更改图标 第二步:odoo14\addons\web\static\src\js ...
- Java中的静态块(static{})
静态块(static{}) (1) static关键字还有一个比较关键的作用,用来形成静态代码块(static{} 即static块 )以优化程序性能. (2) static块可以置于类中的任何地方, ...
- Jenkinsfile_定义全局全量
一.通过def定义全局变量 注意:首行def定义的变量不能使用=赋值. def var pipeline { agent any stages { stage("定义var") { ...
- 现在的AI还能写出短剧剧本了?
本文由 ChatMoney团队出品 现在大家打开抖音.小红书,琳琅满目,目光所能及的都是各种吸精剧情的小短剧,虽然这些短剧的制作成本低,但是作为编剧的要写脚本,可不认为这么容易啊......... 接 ...
- java 分批次读取大文件的三种方法
1. java 读取大文件的困难java 读取文件的一般操作是将文件数据全部读取到内存中,然后再对数据进行操作.例如 Path path = Paths.get("file path&quo ...
- FastAPI日志审计:你的权限系统是否真的安全无虞?
title: FastAPI日志审计:你的权限系统是否真的安全无虞? date: 2025/06/20 16:21:09 updated: 2025/06/20 16:21:09 author: cm ...