CF2061F2.Kevin and Binary String (Hard Version)
NOI/NOI+/CTSC
通过率:0%
AC君温馨提醒
该题目为【codeforces】题库的题目,您提交的代码将被提交至codeforces进行远程评测,并由ACGO抓取测评结果后进行展示。由于远程测评的测评机由其他平台提供,我们无法保证该服务的稳定性,若提交后无反应,请等待一段时间后再进行重试。
题目描述
这是该问题的困难版本。两个版本的区别在于此版本中字符串 $ t $ 由 '0'、'1' 和 '?' 组成。只有当您解决了该问题的所有版本后才能进行 hack。
Kevin 有一个长度为 $ n $ 的二进制字符串 $ s $。Kevin 可以执行以下操作:
- 选择 $ s $ 中两个相邻的块并交换它们。
块是指由相同字符组成的最大子串$ ^{\text{∗}} $。形式化定义:设 $ s[l,r] $ 为子串 $ s_l s_{l+1} \ldots s_r 。当满足以下条件时, s[l,r] $ 构成一个块:
- $ l=1 $ 或 $ s_l \neq s_{l-1} $;
- $ s_l = s_{l+1} = \ldots = s_r $;
- $ r=n $ 或 $ s_r \neq s_{r+1} $。
相邻块是指两个块 $ s[l_1,r_1] $ 和 $ s[l_2,r_2] $ 满足 $ r_1 + 1 = l_2 $。
例如,若 $ s = \mathtt{000},\mathbf{11},\mathbf{00},\mathtt{111} $,Kevin 可以选择块 $ s[4,5] $ 和 $ s[6,7] $ 进行交换,将 $ s $ 变为 $ \mathtt{000},\mathbf{00},\mathbf{11},\mathtt{111} $。
给定一个由 '0'、'1' 和 '?' 组成且长度为 $ n $ 的字符串 $ t $,Kevin 希望确定使对于所有索引 $ i ( 1 \le i \le n $),若 $ t_i \neq $ '?' 则 $ s_i = t_i $ 所需的最小操作次数。若无法实现,输出 $ -1 $。
$ ^{\text{∗}} $ 若字符串 $ a $ 可通过从 $ b $ 的开头和结尾删除若干(可能为零或全部)字符得到,则称 $ a $ 是 $ b $ 的子串。
输入格式
每个测试包含多个测试用例。第一行包含测试用例数量 $ t ( 1 \le t \le 10^4 $)。接下来是测试用例描述。
每个测试用例的第一行包含一个由 '0' 和 '1' 组成的字符串 $ s $。
每个测试用例的第二行包含一个由 '0'、'1' 和 '?' 组成的字符串 $ t $。
保证 $ s $ 和 $ t $ 的长度相同。
保证所有测试用例的 $ s $ 长度之和不超过 $ 4 \cdot 10^5 $。
输出格式
对于每个测试用例,输出一个整数——所需的最小操作次数。若无法实现,输出 $ -1 $。
输入输出样例
输入#1
6 0001100111 0000011111 010101 111000 0101 0110 0101 1010 011001 001110 0 1
输出#1
1 3 1 -1 -1 -1
输入#2
6 010101 ?0?0?? 0101 ?0?0 11100101 ???????? 11100101 ???11?1? 1000100011 ?11?000?0? 10101 ?1011
输出#2
2 -1 0 2 2 -1
说明/提示
第一个示例的第一个测试用例的可能操作方式已在题目描述中展示。
第一个示例的第二个测试用例中,一种可能的操作方式为:
- 交换块 $ [2, 2] $ 和 $ [3, 3] , s $ 变为 $ \mathtt{001101} $;
- 交换块 $ [3, 4] $ 和 $ [5, 5] , s $ 变为 $ \mathtt{000111} $;
- 交换块 $ [1, 3] $ 和 $ [4, 6] , s $ 变为 $ \mathtt{111000} $。
第二个示例的第一个测试用例中,一种可能的操作方式为:
- 交换块 $ [1, 1] $ 和 $ [2, 2] , s $ 变为 $ \mathtt{100101} $;
- 交换块 $ [4, 4] $ 和 $ [5, 5] , s $ 变为 $ \mathtt{100011} $。
翻译由 DeepSeek R1 完成
输入解题思路,AI测评打分。不知道怎么写?