#1164. 01 串变换(Hard)
01 串变换(Hard)
题目描述
这是该问题的困难版本。在这个版本中,你需要求出将字符串 转换为字符串 的最少操作次数。
给定两个长度均为 的二进制字符串 和 。
你可以执行以下任意操作:
- 选定 中等于
001的子串并将其替换为100,反之亦然(即001100或100001)。 - 选定 中等于
110的子串并将其替换为011,反之亦然(即011110或110011)。
你的任务是求出将字符串 转换为字符串 所需的最少操作次数。如果无法使用上述操作将 转换为 ,请输出 -1。
字符串的子串是指通过从原字符串的开头和/或结尾删除若干(可能为零个或全部)个字符所得到的连续字符串片段。
输入格式
第一行包含一个整数 ()—— 测试用例的数量。
对于每个测试用例:
- 第一行包含一个整数 ()—— 字符串的长度。
- 第二行包含一个长度为 的二进制字符串 ,仅由字符
0和1组成。 - 第三行包含一个长度为 的二进制字符串 ,仅由字符
0和1组成。
输出格式
对于每个测试用例,输出一行一个整数,表示将字符串 转换为字符串 所需的最少操作次数。如果无法转换,输出 -1。
样例输入 1
5
4
0100
0001
4
0100
0010
6
110000
000011
8
10101010
10101010
5
01001
10010
样例输出 1
1
-1
4
0
3
说明
样例解释
- 在第一个测试用例中,我们可以选择子串 并将其替换为 。这恰好需要 次操作。
- 在第二个测试用例中,无法将 转换为 ,因此答案为
-1。 - 在第三个测试用例中,我们可以依次进行如下操作:
110000100100100100100001100001001001001001000011这总共需要 次操作。可以证明 次是最少的所需操作次数。
数据范围
- 对于所有测试点,保证 。
- 对于每个测试用例,保证 。
- 保证同一测试点内所有测试用例的 之和不超过 。
- 保证所有的输入字符串仅由
0和1组成。