CF1381A2.Prefix Flip (Hard Version)
普及+/提高
通过率:0%
时间限制:1.00s
内存限制:256MB
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
This is the hard 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 2n operations. It can be proved that it is always possible.
这是该问题的困难版本。两个版本的区别在于对 n 的约束以及所需操作次数的要求。仅当该问题的所有版本均被解决时,才允许进行 hack。
给定两个长度为 n 的二进制字符串 a 和 b(二进制字符串是由字符 0 和 1 组成的字符串)。每次操作中,你需要选择 a 的一个前缀,并同时对该前缀执行两个操作:将其中每一位取反(即 0 变为 1,1 变为 0),再将该前缀中所有位逆序排列。
例如,若 a=001011,你选择长度为 3 的前缀,则 a 变为 011011;接着若你选择整个字符串作为前缀,则 a 变为 001001。
你的任务是在至多 2n 次操作内将字符串 a 变为 b。可以证明,这总是可行的。
输入格式
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≤105) — 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.
第一行包含一个整数 t(1≤t≤1000),表示测试用例的数量。接下来的 3t 行包含各测试用例的描述。
每个测试用例的第一行包含一个整数 n(1≤n≤105),表示二进制字符串的长度。
接下来两行分别包含两个长度为 n 的二进制字符串 a 和 b。
保证所有测试用例中 n 的总和不超过 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.
对于每个测试用例,输出一个整数 k(0≤k≤2n),然后输出 k 个整数 p1,…,pk(1≤pi≤n)。其中 k 表示你所使用的操作次数,而 pi 表示第 i 次操作中所翻转的前缀长度。
输入输出样例
输入#1
5 2 01 10 5 01011 11100 2 01 01 10 0110011011 1000110100 1 0 1
输出#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
说明/提示
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.
在第一个测试用例中,我们有 01→11→00→10。
在第二个测试用例中,我们有 01011→00101→11101→01000→10100→00100→11100。
在第三个测试用例中,两个字符串已经相同。另一种解法是翻转长度为 2 的前缀,这将使 a 保持不变。
输入解题思路,AI测评打分。不知道怎么写?