题目链接
There are two binary strings a and b of length n (a binary string is a string consisting of symbols 0 and 1). In an operation, you select a prefix of a, and simultaneously invert the bits in the prefix (0 changes to 1 and 1 changes to 0) and reverse the order of the bits in the prefix.
For example, if a=001011 and you select the prefix of length 3, it becomes 011011. Then if you select the entire string, it becomes 001001.
Your task is to transform the string a into b in at most 2n operations. It can be proved that it is always possible.
The first line contains a single integer t (1≤t≤1000) — the number of test cases. Next 3t lines contain descriptions of test cases.
The first line of each test case contains a single integer n (1≤n≤1e5) — the length of the binary strings.
The next two lines contain two binary strings a and b of length n.
It is guaranteed that the sum of n across all test cases does not exceed 105.
For each test case, output an integer k (0≤k≤2n), followed by k integers p1,…,pk (1≤pi≤n). Here k is the number of operations you use and pi is the length of the prefix you flip in the i-th operation.
5
2
01
10
5
01011
11100
2
01
01
10
0110011011
1000110100
1
0
1
3 1 2 1
6 5 2 5 3 1 2
0
9 4 1 2 10 4 1 2 1 5
1 1
这题发现题解的思路真的妙,将字符串 a a a 转为 0 0 0 需要步骤 s 1 s1 s1,将字符串 b b b 转为 0 0 0 需要步骤 s 2 s2 s2,那么只要将 s 1 s1 s1 加上倒置的 s 2 s2 s2 即可,AC代码如下:
#include
using namespace std;
int main()
{
int t,n;
string a,b;
cin>>t;
while(t--){
cin>>n>>a>>b;
a+='0',b+='0';
vector<int>v1,v2;
for(int i=1;i<=n;i++){
if(a[i]!=a[i-1]) v1.push_back(i);
if(b[i]!=b[i-1]) v2.push_back(i);
}
v1.insert(v1.end(),v2.rbegin(),v2.rend());
cout<<v1.size()<<endl;
for(auto i:v1) cout<<" "<<i;
puts("");
}
}