CodeForces 1237H Balanced Reversals

CodeForces 1237H Balanced Reversals

2s,512MB

长度为偶数 \(n\) 的01串 \(a,b\) .

问是否可以通过至多 \(n+1\) 次如下操作将 \(a\) 变成 \(b\) .

  • 选择一个偶数 \(p \le n\) ,将 \(a\) 变成 \(a_pa_{p-1}\cdots a_1a_{p+1} a_{p+2}\cdots a_n\)

若存在,输出方案.

\(T\) 组数据.

\(1 \le T \le 2000\) ,所有数据 \(n\) 的和不超过 \(4000\)

Tutorial

思考 \(a,b\) 中按形如 \(a_1a_2,a_3a_4...\) 的方式分割时,如果我们可以如下操作

  • 假如当前 \(a[1\cdots i]=b[n-i+1\cdots n]\)
  • 找到 \(x\) 满足 \(x \equiv 1 \mod 2\)\(a_x=b_{n-i},a_{x+1}=b_{n-i-1}\)
  • 翻转 \(x-1,x+1\)
  • 现在 \(a[1 \cdots i+2]=b[n-i-1\cdots n]\)

总操作次数为 \(2 \cdot \dfrac n2=n\) .

发现需要00=00,01=10,10=01,11=11

如果00!=00或11!=11,那么一定无解

否则就需要额外一步将01与10转化的操作

考虑能否用1步完成所有的转化,发现总是可以通过翻转 \(a\)\(b\) 的一个前缀来完成(翻转 \(b\) 的一个前缀相当于在最后翻转 \(a\) 的对应前缀).

复杂度 \(O(n^2)\)

posted @ 2020-06-25 09:41  LJZ_C  阅读(138)  评论(0编辑  收藏  举报