CF1392G
CF1392G
给定一个长度为 \(k\) 的 01
串 \(s,t\),给定 \(n\) 个操作,第 \(i\) 个操作为交换 \(s\) 中的 \(u_i\) 和 \(v_i\)
然后你选择一个区间的操作依次执行,这个区间的长度不能小于 \(m\)。
最大化 \(s\) 和 \(t\) 相同的位置数量。
\(m,n\le 10^6,k\le 20\)
Solution
神仙题。
设 \(w(s,t)\) 表示 \(s\) 和 \(t\) 得到的答案。
\(p(l,r)\) 表示顺序操作 \(l\to r\)
\(p(r,l)\) 表示顺序操作 \(r\to l\)
- 性质 1
若 \(s\xrightarrow{p(l,r)}s',t\xrightarrow{p(l,r)}t',w(s,t)=w(s',t')\)
注意到每一位是独立被操作了相同的,不会改变。
所以设 \(s\xrightarrow{p(l,r)}s'\),那么若 \(s'\xrightarrow{p(r+1,n)}s'',t\xrightarrow{p(r+1,n)}t''\),则 \(w(s',t)=w(s'',t'')\)
同理,答案也等价于 \(s'\xrightarrow{p(l-1,1)}s'',t\xrightarrow{p(r,1)}t''\) 情况下的答案。
所以我们得到了 \(n\) 个字符串 \(s'\) 和 \(n\) 个字符串 \(t'\),我们发现问题等价于选两个下标差大于等于 \(m\) 的字符串并得到答案。
还是不好做。
然后观察到,所有 \(s/t\) 的二进制下 \(1\) 的个数固定,设 \(\textrm{bit}(s)\) 为 \(a\),\(\textrm{bit}(t)=b\),\(\textrm{bit}(s~\mathbf{and}~t)=c\),那么有答案为 \(k-(a-c)-(b-c)=k-a-b+2c\),所以问题等价于最大化 \(c\)
然后维护 \(f_{0,x}\) 表示所有 \(s_i=x\) 中最小的 \(i\),维护 \(f_{1,x}\) 表示所有 \(t_i=x\) 中最大的 \(i\)
然后将他们进行子集转移,对于某个 \(x\),如果 \(f_{1,x}-f_{0,x}\ge m\),那么就可以更新答案,即存在两个字符串满足其并大于等于 \(\textrm{bit}(x)\)。
复杂度为 \(\mathcal O(nk+2^kk)\)