【校内模拟】【18-10-31】几串字符 【数位DP】

题解

30pts

考虑到L和R的范围都很小,直接暴力枚举L~R然后统计答案即可。

70pts

如果观察一下,你会发现以下几个性质:

1.num01+num10+num11+num00= len-1。
2. num01+1≥num10≥num01,因为10,01是交替出现的。
3. num10+num00 是0出现的次数。
4. num01+num11+1 是1出现的次数。

这个可以自己手推一下,很容易证明。

那么这个字符串长什么样,其实已经大体确定了,举例说明:

10001010110111111010

由于所有的01和10之间全是1,所有的10和01之间全是0,因此我们可以把字符串看成几段:

1 000 1 0 1 0 11 0 111111 0 1 0

考虑数位DP,记录当前是第 i 位,前面出现了 j段,1 (或0) 出现了 k 次的方案数,再多记一个是否超过上界,枚举下一位转移即可。

100pts

如果我们已知上界R是 1011100010

那么对于前五位是 10110 的数来说,后面的位置无论怎么选都不会超过R。

我们就考虑啊,能不能快速算出这时候符合条件的方案数呢?

还真可以!

我们从第一位往最后一位扫一遍,过程中记录后面还能出现多少个0和1(具体实现是记录10,00,01,11的个数)。每扫到一个为1的位置,考虑如果我们在这一位放0的话后面就可以乱选了,因此我们就给ans加上当前位及之前已经确定,后面随便选,且符合条件的方案数。这个方案数可以这么表示:

Cnum11+num01+1num11C_{num_{11}+num_{01}+1}^{num_{11}} +Cnum00+num10num10C_{num_{00}+num_{10}}^{num_{10}}

如果不能一下子理解,可以回到上面去看下那几个式子,带进来理解一下。

其实这就是个球盒问题,是

球相同(每一段1内部的1的顺序不重要)

盒子不同(每一段的前后位置不同)

且不能空盒(每一段都不为空)

的那一种。

所以就这样 logR 的扫一遍,再 logL 的扫一遍,把两个答案减一下,就做完啦~

最后,因为你计算的是<R和<L的方案数,相减得到的ans是在[L,R)的区间,所以还需要特判R本身能否满足条件。

至此,我们就开心的做完啦~

当然具体的实现还需要判断一些特殊的情况,比如当lenL或lenR小于合法长度的时候直接返回方案数为0,lenL或lenR大于合法长度时直接返回所有满足条件的方案数,这些就是细节问题啦。

总结

看到的第一眼就想到了数位DP,碍于自己连数位DP的模板题都没练过只好打了30pts的暴力……

其实这道题还是在寻找规律,寻找的是给定的01,00,10,11的个数与1的个数、0的个数、合法方案的长度之间的关系。

所以我得好好补习数论否则就透心凉心飞扬了

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章