Codeforces Round #658 (Div. 1) A2. Prefix Flip (Hard Version)

Codeforces Round #658 (Div. 1) A2. Prefix Flip (Hard Version)

题目链接

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.

Input

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.

Output

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.

Example

input

5
2
01
10
5
01011
11100
2
01
01
10
0110011011
1000110100
1
0
1

output

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("");
    }
}

你可能感兴趣的:(字符串,思维,Codeforces)