CF997A Convert to Ones

题目描述

你有一个由 $a_1, a_2, \dots, a_n$ 组成的字符串,字符串只包含 $0$ 和 $1$。 我们称一段连续的元素 $a_i, a_{i+1}, \ldots, a_j$($1 \leq i \leq j \leq n$)为字符串 $a$ 的一个子串。 你可以对字符串 $a$ 进行如下两种操作,次数不限: - 选择字符串 $a$ 的某个子串(可以是整个字符串),将其反转,需支付 $x$ 个硬币(例如,「0101101」$\to$「0111001」); - 选择字符串 $a$ 的某个子串(可以是整个字符串,也可以是单个字符),将其中的每个符号取反($0$ 变为 $1$,$1$ 变为 $0$),需支付 $y$ 个硬币(例如,「0101101」$\to$「0110001」)。 你可以以任意顺序进行这些操作。允许对同一个子串多次进行操作。 你需要将字符串 $a$ 变成只包含 $1$ 的字符串。请问最少需要花费多少硬币?如果不需要进行任何操作,请输出 $0$。

输入格式

输入的第一行包含三个整数 $n$、$x$ 和 $y$($1 \leq n \leq 300\,000, 0 \leq x, y \leq 10^9$),分别表示字符串的长度、反转操作的费用和取反操作的费用。 第二行包含一个长度为 $n$ 的只包含 $0$ 和 $1$ 的字符串 $a$。

输出格式

输出一个整数,表示将字符串变为全 $1$ 所需的最小总费用。如果不需要进行任何操作,输出 $0$。

说明/提示

在第一个样例中,首先需要反转子串 $[1 \dots 2]$,然后取反子串 $[2 \dots 5]$。 字符串变化如下: 「01000」$\to$「10000」$\to$「11111」。 总费用为 $1 + 10 = 11$。 在第二个样例中,首先取反子串 $[1 \dots 1]$,然后取反子串 $[3 \dots 5]$。 字符串变化如下: 「01000」$\to$「11000」$\to$「11111」。 总费用为 $1 + 1 = 2$。 在第三个样例中,字符串已经全为 $1$,所以答案为 $0$。 由 ChatGPT 4.1 翻译