Codeforces 1382C1 - Prefix Flip (Easy Version)(思维)
C1. Prefix Flip (Easy Version)
time limit per test1 second
memory limit per test256 megabytes
input standard input
outpu tstandard 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.
题目大意:
给出 t 组样例,对于每组样例给出一个长度 n ,然后输入两个01串a b,然后有这样一个操作:选择长度为 i 的前缀,全部取反并逆置,询问能否在3n个操作以内使a b 相等,输出操作次数以及每次操作所选择的前缀。
解题思路:
答案是一定能通过3 n个操作使a b 相等,我们可以一个一个的判断,如果s i != s1 i ,则可以先取i (取反并逆置),然后再取1,改第一个字母,然后再取 i ,取反逆置,就可以实现单个字母的修改,如果是第一个字母不同的话只需要修改1 次 1 即可,这样是一定能在3n个操作之内实现a == b 的。AC代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
using namespace std;
const int mod = 1e4;
const int N = 1e5 + 50;
const int inf = 0x3f3f3f3f;
typedef long long ll;
typedef pair<int, int> pii;
string s, s1;
int ans[N];
int main()
{
int t;
cin >> t;
while (t--)
{
int n, cnt=0;
cin >> n >> s >> s1;
if (s[0] != s1[0])
ans[cnt++] = 1;
for (int i = 1; i < n; i ++)
{
if (s[i] != s1[i])
{
ans[cnt++] = i + 1;
ans[cnt++] = 1;
ans[cnt++] = i + 1;
}
}
cout << cnt;
for (int i = 0; i < cnt; i ++)
cout << " " << ans[i];
cout << endl;
}
return 0;
}