P0890

[Usaco2006 Mar]Lights Out 关灯

[Usaco2006 Mar]Lights Out 关灯

奶牛喜欢在黑暗中睡觉。每天晚上,牲口棚中有 LL 盏灯,奶牛希望最终亮着的灯尽可能少。它们知道灯的开关在哪里,却无法直接操作,因此需要借助一个长度为 TT 的插槽改变灯的状态。

所有灯从左到右编号为 11 到 LL。每次操作选择一个整数 pp,满足 1≤p≤L−T+11\le p\le L-T+1,并将插槽左端对准第 pp 盏灯。对于每个满足 0≤j<T0\le j<T 的整数 jj:

  • 若插槽字符串的第 j+1j+1 位为 11,则翻转第 p+jp+j 盏灯的状态,即 00 变为 11,11 变为 00;
  • 若插槽字符串的第 j+1j+1 位为 00,则第 p+jp+j 盏灯的状态保持不变。

各次操作的效果按异或叠加。若 T>LT>L,则不存在合法的操作位置。

设所有操作位置按严格递增顺序记为 p1,p2,…,pKp_1,p_2,\ldots,p_K。你需要依次满足以下目标:

  1. 使操作后亮灯的数量最少;
  2. 在此基础上,使操作次数 KK 最少;
  3. 若仍有多种方案,选择序列 (p1,p2,…,pK)(p_1,p_2,\ldots,p_K) 字典序最大的方案。

输入格式

第一行包含两个整数 LL 和 TT。

第二行包含一个长度为 LL 的二进制字符串,表示所有灯的初始状态。其中,00 表示灯熄灭,11 表示灯亮起。

第三行包含一个长度为 TT 的二进制字符串,表示插槽。11 表示翻转对应位置的灯,00 表示对应位置的灯保持不变。

输出格式

第一行输出操作次数 KK。

随后 KK 行依次输出操作位置 p1,p2,…,pKp_1,p_2,\ldots,p_K。

样例输入

10 4
1111111111
1101

样例输出

5
1
3
4
6
7

样例解释

共使用插槽 55 次,灯的状态变化如下:

  • 初始状态为 11111111111111111111;
  • 在位置 11 使用插槽后,状态变为 00101111110010111111;
  • 在位置 33 使用插槽后,状态变为 00011011110001101111;
  • 在位置 44 使用插槽后,状态变为 00000001110000000111;
  • 在位置 66 使用插槽后,状态变为 00000111010000011101;
  • 在位置 77 使用插槽后,状态变为 00000100000000010000。

可以证明,该方案使最终亮灯数最少;在此基础上,操作次数最少;在同时满足前两项的方案中,其严格递增的操作位置序列字典序最大。

数据范围

  • 3≤L≤503\le L\le 50;
  • 1≤T≤71\le T\le 7。

来源与许可

本题为 USACO 2006 March 试题「Lights Out(关灯)」,题面与测试数据整理自 BZOJ。

样例 1

输入

10 4
1111111111
1101

输出

5
1
3
4
6
7