题意
我们定义一个01字符串是good当且仅当每个奇数位index的数字是1-index这个子串的中位数(即这个数字是1-index子串中出现最多的数字)。定义extend操作为对于一个01串,在两两数字之间插入0/1.现给定一个01串,问对于所有的前缀,extend后为good的串有多少。
解法
首先我们能够得到以下两个结论:
- 我们首先考虑一个全为0的字符串,长度为k。如果我们要扩展这个字符串,那么对k-1个空我们能够随便填写,因为不论我们怎么填0都已经必然是出现次数最多的,所以答案为2^(k-1)。
- 现在我们考虑有不同字符的01串。首先我们能够发现,如果是01这种相邻不一样的串,在extend时必须插入1。所以对于这种相邻不一样的串,我们能插入的串是固定的。
基于上述结论,假定我们的初始01串为…01(长度k),那么我们就能够反推出唯一的一个extend good串。对于长度为k-1,0结尾的前缀,由于它是一个good串,那么extend后的串中应该有k-1个0,也就是至多k-2个1。对于长度为k,1结尾的前缀,由于他extend后是good,所以extend后的串至少有k个1,在结尾已经有一个1,前面至多k-2个1的情况下,不难知道,0和1中必须放入1.同时,这个结论是能向前递推的,不论之前的串是相同的还是不同的,有兴趣的可以自己推一下,这里不再赘述。
基于上述讨论,我们能够知道,一个01/10这种相邻不同的串就能让最后一位的统计还原为1,同时如果是11,00这种相邻一样的串,每次答案都是上一个答案的2倍。所以最终的算法为,从头开始计算,如果当前数字和上一个一样,计数器变为2倍,否则计数器重制为1.对每一位的计数器累加就是答案。
代码
1 |
|