CF2254C2 Marenol (hard version)
题目描述
这是本题的难度较高版本。在本版本中,你需要求出将 $a$ 变换为 $b$ 所需的最少操作次数。
Yousef 给了你两个长度相同的二进制字符串 $a$ 和 $b$。
你可以进行以下任意操作:
- 选择 $a$ 中的某个子串$^*$,如果它等于 $\texttt{001}$,则可以将其替换为 $\texttt{100}$,反之亦然(即 $\texttt{001} \rightarrow \texttt{100}$ 或 $\texttt{100} \rightarrow \texttt{001}$)。
- 选择 $a$ 中的某个子串,如果它等于 $\texttt{110}$,则可以将其替换为 $\texttt{011}$,反之亦然(即 $\texttt{011} \rightarrow \texttt{110}$ 或 $\texttt{110} \rightarrow \texttt{011}$)。
你的任务是求出将字符串 $a$ 变换为字符串 $b$ 所需的最少操作次数。如果无法通过上述操作将 $a$ 变换为 $b$,则输出 $-1$。
$^*$字符串 $a$ 是字符串 $b$ 的一个子串,如果 $a$ 可以通过删除 $b$ 的若干(可能为零或所有)前缀和若干(可能为零或所有)后缀字符得到。
输入格式
第一行包含一个整数 $t$($1 \le t \le 10^4$),表示测试用例的数量。
每个测试用例的第一行包含一个整数 $n$($1 \le n \le 2 \cdot 10^5$),表示每个字符串的长度。
每个测试用例的第二行包含一个二进制字符串 $a$($|a| = n$),字符串中仅包含字符 $\texttt{0}$ 和/或 $\texttt{1}$。
每个测试用例的第三行包含一个二进制字符串 $b$($|b| = n$),字符串中仅包含字符 $\texttt{0}$ 和/或 $\texttt{1}$。
保证所有测试用例中 $n$ 之和不超过 $2 \cdot 10^5$。
输出格式
每组测试用例输出一行,表示将 $a$ 变换为 $b$ 所需的最少操作次数。如果无法完成变换,则输出 $-1$。
说明/提示
在第一个测试用例中,我们可以选择子串 $a[2, 4]=\texttt{100}$,将其替换为 $\texttt{001}$。这仅需 $1$ 次操作。
在第二个测试用例中,无法将 $a$ 变换为 $b$,因此答案为 $-1$。
在第三个测试用例中,我们可以按照以下步骤操作:
- $\texttt{1}\ {\color{blue}{\texttt{100}}}\ \texttt{00}\ \rightarrow\ \texttt{1}\ {\color{blue}{\texttt{001}}}\ \texttt{00}$
- $\texttt{100}\ {\color{blue}{\texttt{100}}}\ \rightarrow\ \texttt{100}\ {\color{blue}{\texttt{001}}}$
- ${\color{blue}{\texttt{100}}}\ \texttt{001}\ \rightarrow\ {\color{blue}{\texttt{001}}}\ \texttt{001}$
- $\texttt{00}\ {\color{blue}{\texttt{100}}}\ \texttt{1}\ \rightarrow\ \texttt{00}\ {\color{blue}{\texttt{001}}}\ \texttt{1}$
共需 $4$ 次操作。并且可以证明 $4$ 是最少的操作次数。
由 ChatGPT 5 翻译