【CF】1234F-Yet Another Substring Reverse 题解

传送门:1234F
标签:动态规划

题目大意

你将得到一个只包含前 20 个小写字母(‘a’,‘b’,…,‘t’)的字符串 s。字符串 s 的子串 s[l;r] 是字符串 slsl+1…sr。你可以执行以下操作 不多于一次:选择某个子串 s[l;r] 并反转它(即字符串 slsl+1…sr 变为 sr,sr-1…sl)。你的目标是最大化 s 中由唯一字符组成的最长子串的长度。
输入:输入的第一行包含一个字符串 s,其长度不超过106,且仅包含 ‘a’, ‘b’, … , ‘t’(前 20 个小写字母)。
输出:输出一个整数——在反转不多于一次的情况下,s 中由唯一字符组成的最长子串的最大可能长度。

算法分析

  • 我们可以将问题简化为以下内容:找到两个字母不相交的给定字符串的子串,且它们的总长度是最大的。为什么我们可以进行这样的简化?这是因为我们的答案最多由两个不相交的部分组成:一个固定的子串和附加到第一个子串上的至多一个子串。我们可以通过一次反转操作将任何其他子串附加到第一个子串上。

  • 然后遍历所有包含不同字母的子串,长度不超过 AL(AL 是字母表的大小)。我们这样做的复杂度为O(nAL)。让当前包含不同字母的子串为 s[i;j]。我们创建与该子串对应的掩码:第 pos 位为 1 当且仅当 pos 字母出现在子串中,否则为 0(字母从 0 开始计数)。

  • 接下来要存储所有掩码,因为当前问题可以简化为以下内容:我们有一组掩码,需要找到一对掩码,它们不相交且它们的总一位数是可能的最大值,不过这种减少不如以前明显。

  • 那么如何解决这个问题呢?我们可以使用动态规划。dp_mask 是给定字符串中存在的掩码的一位数的最大值,并且它是

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值