Prefix Flip (Easy Version)

hexWars發表於2020-10-16

Prefix Flip Easy Version

題目

This is the easy version of the problem. The difference between the versions is the constraint on n and the required number of operations. You can make hacks only if all versions of the problem are solved.

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 3n 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≤1000) — 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 1000.

Output
For each test case, output an integer k (0≤k≤3n), 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
Note
In the first test case, we have 01→11→00→10.

In the second test case, we have 01011→00101→11101→01000→10100→00100→11100.

In the third test case, the strings are already the same. Another solution is to flip the prefix of length 2, which will leave a unchanged.

解釋

題意大致為
給出兩個二進位制數
第一個二進位制數通過k次操作,把前ai個字首全部取反並倒序輸出,使得經過操作後的第一個數和第二個數相等
思路:
把第一個數全部弄成0或者1,最多n次
第一個數的最後一位和第二個數的最後一位不一樣,那就第一位數全部取反
第二個數字開始從後往前進行操作
如果發現不一樣的,那進行記錄,最多n次
最多2n+1次

我原本沒想到這個演算法,複雜的操作也可以通過演算法變得很簡單

程式碼

#include<bits/stdc++.h>
using namespace std;
char cb[2][10000];
int qq[10000];
int main()
{
	int t;
	cin >> t;
	while (t--)
	{
		int n,ans = 0;
		int cut = 0;
		cin>>n;
		cin>>cb[0];
		cin>>cb[1];
		int pd = 1;
		for(int i=0 ; i<n ; i++){
			cb[0][i] = cb[0][i] - '0';
			cb[1][i] = cb[1][i] - '0';
			if(cb[0][i] != cb[1][i])pd = 0;
		}
		if(pd == 1){
			printf("0\n");
		}else{
			for(int i=1 ; i<n ; i++){
				if(cb[0][i] != cb[0][i-1]){
					ans++;
					qq[cut++] = i;
				}
			}
			if(cb[1][n-1] != cb[0][n-1]){
				ans++;
				qq[cut++] = n;
			}
			for(int i=n-2 ; i>=0 ; i--){
				if(cb[1][i] != cb[1][i+1]){
					ans++;
					qq[cut++] = i+1;
				}
			}
			printf("%d ",ans);
			for(int i=0 ; i<cut ; i++){
				printf("%d ",qq[i]);
			}printf("\n");
		}
	}
	return 0;
}

參考:
Prefix Flip (Easy Version)/(Hard Version)

相關文章