题目 | Serval and Shift-Shift-Shift
Codeforces Round #853 (Div. 2)
D. Serval and Shift-Shift-Shift
https://codeforces.com/contest/1789/problem/D
2 seconds / 256 megabytes
standard input / standard output
Problem
Serval has two
Since Toxel likes the number
In other words, the operation moves every bit of
Serval does not have much time. He wants to perform no more than
In this problem,
Input
Each test contains multiple test cases. The first line contains the number of test cases
The first line of each test case contains a single integer
The second and the third line of each test case contain a binary string of length
It is guaranteed that the sum of
Output
For each test case, if it is impossible to change
Otherwise, in the first line, print the number of operations
If
If there are multiple solutions, print any of them.
Example
Input
3
5
00111
11000
1
1
1
3
001
000
Output
2
3 -2
0
-1
Note
In the first test case:
The first operation changes
The second operation changes
The bits with strikethroughs are overflowed bits that are removed. The bits with underline are padded bits.
In the second test case,
In the third test case, it can be shown that
题解
这道题是一道构造题,我们的思路就是如何构造一种通法来解决这个问题。
不成立的情形
按位异或时,每一个二进制位具有以下特性(
那么我们可以发现,只有
由此我们就能推出不成立的情形,即:若
如何构造通解
首先注意到
如
再右移三位进行操作:
再右移四位进行操作:
我们可以发现,操作的实质就是用最左边一位的
在调整一位的适合,可能会有副作用,导致右边有已经一致的位又变得不一致,但这也没有关系,因为我们是从左到右进行操作的,发生变化的只有可能是右侧部分,每一次操作后我们能保证左侧部分已经一致。
此时还有一个问题,如果
这样就成功构造最左侧的
如何确保步数限制
题目要求步数限制不超过
反着来时,没有必要再反着写一遍代码,直接把串
代码
#include <bits/stdc++.h>
#define endl '\n'
using namespace std;
vector<int> getans(string a, string b)
{
vector<int> ans;
int n = a.size();
if (a[0] == '0')
{
int t = n - 1;
while (a[t] == '0')
t--;
ans.push_back(t);
a[0] = '1';
}
for (int i = 1; i < n; i++)
{
if (a[i] != b[i])
{
ans.push_back(-i);
string t = a;
for (int j = 0; j < n; j++)
{
if (i + j >= n)
break;
if (t[j] == a[i + j])
a[i + j] = '0';
else
a[i + j] = '1';
}
}
}
if (b[0] == '0')
{
int t = n - 1;
while (a[t] == '0')
t--;
ans.push_back(t);
a[0] = '0';
}
return ans;
}
void solve()
{
int n;
cin >> n;
string a, b;
cin >> a >> b;
if (a == b)
{
cout << 0 << endl;
return;
}
if (a.find('1') == a.npos ||
b.find('1') == b.npos)
{
cout << -1 << endl;
return;
}
vector<int> ans = getans(a, b);
if (ans.size() <= n)
{
cout << ans.size() << endl;
for (auto ele : ans)
cout << ele << ' ';
cout << endl;
return;
}
reverse(a.begin(), a.end());
reverse(b.begin(), b.end());
ans = getans(a, b);
cout << ans.size() << endl;
for (auto ele : ans)
cout << -ele << ' ';
cout << endl;
return;
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--)
solve();
return 0;
}
本文采用 CC BY-SA 4.0 许可,本文 Markdown 源码:Haotian-BiJi