Sequence Folding

发布时间 2023-11-02 22:48:20作者: Kreap

Description

给定一个长为 \(2^n\) 的 01 串,其中只有 \(m\) 个位置的值是 \(1\)。每次可以将某一位的值翻转,一旦当前串是一个回文串,就可以把串翻折减半。求最后只剩一个数码时,最小的所需翻转次数。 \(2^n\leq 10^{18},m\leq 10^5\)

Solution

观察当前状态翻转一位对下一层有什么影响,假若当前状态 \(sta\) 中有一对不匹配的数位,那么无论翻转其中哪一个,都会使步数增加且仅增加一。而当我们转移到下一层时,整个右半部分会被砍掉,起到作用的只有左边一半。于是翻转操作就相当于把左边那个之前没匹配上的数位改成一个通配符。因为不管左边那位是否翻转,之前已经所花的步数是一样的。