CF2061F2 Kevin and Binary String (Hard Version)
题目描述
这是该问题的困难版本。两个版本的区别在于此版本中字符串 $ t $ 由 '0'、'1' 和 '?' 组成。只有当您解决了该问题的所有版本后才能进行 hack。
Kevin 有一个长度为 $ n $ 的二进制字符串 $ s $。Kevin 可以执行以下操作:
- 选择 $ s $ 中两个相邻的块并交换它们。
块是指由相同字符组成的最大子串$ ^{\text{∗}} $。形式化定义:设 $ s[l,r] $ 为子串 $ s_l s_{l+1} \ldots s_r $。当满足以下条件时,$ s[l,r] $ 构成一个块:
1. $ l=1 $ 或 $ s_l \neq s_{l-1} $;
2. $ s_l = s_{l+1} = \ldots = s_r $;
3. $ 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. 交换块 $ [2, 2] $ 和 $ [3, 3] $,$ s $ 变为 $ \mathtt{001101} $;
2. 交换块 $ [3, 4] $ 和 $ [5, 5] $,$ s $ 变为 $ \mathtt{000111} $;
3. 交换块 $ [1, 3] $ 和 $ [4, 6] $,$ s $ 变为 $ \mathtt{111000} $。
第二个示例的第一个测试用例中,一种可能的操作方式为:
1. 交换块 $ [1, 1] $ 和 $ [2, 2] $,$ s $ 变为 $ \mathtt{100101} $;
2. 交换块 $ [4, 4] $ 和 $ [5, 5] $,$ s $ 变为 $ \mathtt{100011} $。
翻译由 DeepSeek R1 完成