欢迎光临散文网 会员登陆 & 注册

[Codeforces is All You Need] ER 137 D (1743D) - Solution

2022-10-18 01:25 作者:故寓诸无竟  | 我要投稿

问题简述

        给定一个0%2F1串,要求找到它的两个子串(可以有重叠),使得两个子串表示的二进制数按位或的结果最大。

        题目链接:https://codeforces.com/contest/1743/problem/D

思路

        “随机生成”、“不允许Hack”。这样的字眼提示非常明显了——本题大概率需要利用随机性质来保证复杂度/贪心的正确性等。

        首先不难发现两个朴素的事实:1)给定字符串的前导零对于问题而言毫无意义;2)让其中一个子串从首个非零位延展到末位一定是最优解的一部分。这样问题转化为,假设原字符串删去前导零之后的字符串为s,求:

%5Cmax_%7Bt%20%5Csubseteq%20s%7D%20s%20%7C%20t

        其中ts的一个子串。这里将字符和其表示的二进制数混用了,但不会带来理解的困难。

        即然问题是按位或,那么关键的肯定是s0的位置,假设首个0的位置是u。由于s必然以1开头,因此不难发现,取t_x%3D1...(%E4%B8%80%E5%85%B1%7Cs%7C-u%E4%BD%8D)时,按位或能将su处的0转变为1。由于越高位位权越大,那么如果某子串不能将su处的0转变为1,则一定比t_x更差。这就意味着,最优的子串t必须以前u-11中的某一个开头,且长度至少为%7Cs%7C-u

        由此,可以得到一个复杂度为O(u%5E2%7Cs%7C)的暴力的枚举算法。但由于生成数据的随机性,我们得到p的分布如下:

P(u%20%3E%20u_0)%20%3D%20%5Cleft(%5Cfrac%7B1%7D%7B2%7D%5Cright)%5E%7Bu_0%7D

        那么,不小于概率p地,该算法的实际复杂度为:O(%7Cs%7C%5Ccdot%20%5Cleft%5B%5Clog_2%20%5Cfrac%7B1%7D%7B1-p%7D%5Cright%5D%5E2),取p%3D0.999时,已经能以超过96%5C%25的概率通过全部测试点(40个),而此时复杂度还不到O(100%5Ccdot%20%7Cs%7C),可以通过本题。

后记

        本场的实况录屏地址为https://www.bilibili.com/video/BV1bG4y1n7oH

        没过E/F呢(E大概需要动态规划吧),还需要继续加油。


[Codeforces is All You Need] ER 137 D (1743D) - Solution的评论 (共 条)

分享到微博请遵守国家法律