题目描述
- 有一个长度为 \(n+m\) 的 \(01\) 串 \(S\)
- 令 \(F(S)=\sum_{i=1}^{|S|}2^{|S|-i}S_i\) 就是 \(01\) 串的二进制值
- 把 \(S\) 划分成两个长度分别为 \(n,m\) 的子序列 \(A,B\),使得 \(F(A)+F(B)\) 最大
- \(|S|\le 10^6\)
题解
- 首先不失一般性令 \(n\ge m\)
- 性质1:设我们把 \(S\) 的一段前缀划分给 \(A\),\(B\),那么 \(A\) 的剩余位置 \(\ge\) \(B\) 的剩余位置
- 性质2:在 \(B\) 还有剩余位置的时候,\(A\) 不可能填 \(0\).
- 这都显然正确.
- 那么我们考虑一个 \(B\) 结尾的位置 \(i\)
- \(A=\) \(i-m\) 个 \(1\) \(+[i+1,n+m]\)
- \(B=\) \([1,i]\) 中去除靠后的 \(i-m\) 个 \(1\)
- 考虑一次 \(i+1\) 的变化,若是 \(1\) 对 \(F(A),F(B)\) 没有影响,若是 \(0\) 相当于 \(F(B)-2^x\),\(F(A)+2^y\),\(x\)递增,\(y\) 递减。平衡一下的那个 \(i\) 就是答案.