CF 1381A1. Prefix Flip (Easy Version)

A1. Prefix Flip (Easy Version)
time limit per test1 second
memory limit per test256 megabytes
inputstandard input
outputstandard output
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.


题意

有两个二进制字符串长度为 n 的 a 和 b (字符串由0和1组成)。可以进行一次操作,选择一个 a 串的前缀,将他取反并且将该前缀的顺序颠倒,用最多 3n 个操作将字符串 a 转换成 b。

思路

对同一个位置进行偶数次操作, 字符串不改变.

因此我们把要改变的位置操作三次,不改变的位置操作两次。

从前往后遍历, 如果 i 位置不满足条件:

  1. 操作 [ 1 , i ] [ 1, i ] [1,i] 区间.

  2. 然后再操作 [ 1 , 1 ] [1, 1] [1,1] 区间. (保证要改变的位置操作三次)

  3. 最后再操作一次 [ 1 , i ] [1, i] [1,i] 区间.

通过这样的三步操作后, 我们就可使得单个位置取反.’


#include<bits/stdc++.h>
using namespace std;
typedef pair<int, int> PII;
typedef long long ll;

int main()
{
	int t; cin >> t;
	while (t--)
	{
		int n; cin >> n;
		vector<int> v;
		string a, b; cin >> a >> b;
		for (int i = 0; i < n; i++) if (a[i] != b[i]) v.push_back(i + 1);

		cout << v.size() * 3 << endl;
		for (auto u : v) cout << u << ' ' << 1 << ' ' << u << ' ';

		cout << endl;
	}

	return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值