塔子哥突然收到一封信,里面有一个一个十六进制数,信里提到,这个十六进制数表示一个长度为 n 的 01 字符串。
信中写道,你能否通过左右移动一个和该01字符串相同的字符串,来用1覆盖掉原字符串中的0(0 并不会覆盖 1),使得原字符串变成一个长度为 n 的全 1 字符串。如果可以请将方案写出,如果同时存在多个方案,请写下移动次数最少的方案。
塔子哥一直在思考这个问题该如何解决,你能帮助塔子哥解决这个问题吗?
题目要求我们将一个用十六进制数表示的二进制序列(长度为 n 的 01 字符串)通过左右平移一个相同的字符串,用其中的 1 覆盖掉原字符串中的 0,从而使原字符串变成全 1。输入包含一个整数 n(表示二进制字符串的长度)和多个十六进制数(用空格分隔,表示这个 01 字符串的内容)。要求输出能使字符串变为全 1 的所有平移方案,方案应优先输出右移,且每个方向只需输出移动次数最少的方案。如果无法完成覆盖,输出 0。
先将十六进制转成二进制,然后要么往左移动若干位,要么往右移动若干位。枚举这两种情况即可。注意二进制可能很大,无法直接使用内置int或者long类型。C++需要使用bitset,python直接使用内置的大整数。Java需要手写bitset.