你需要将给定的位串按照指定要求进行重排。唯一允许的操作是交换相邻的位。请编写一个程序,计算所需的最小交换次数。
初始位串由一系列位表示,而目标位串由游程编码(run-length code)指定。位串的游程编码是位串中连续的零或一的最大序列长度序列。例如,“011100”的游程编码为“1 3 2”。注意,具有相同游程编码的位串有两种,一种以 0 开头,另一种以 1 开头。目标位串是这两种中的任意一种。
在样例 1 中,位串“100101”需要重排,使其游程编码为“1 3 2”,这意味着目标位串要么是“100011”,要么是“011100”。要得到“011100”至少需要 4 次交换。另一方面,要得到“100011”仅需 1 次交换。因此,在这个例子中,答案是 1。
输入格式
输入包含一组测试用例。测试用例格式如下:
$N \ M$ $b_1 \ b_2 \dots b_N$ $p_1 \ p_2 \dots p_M$
第一行包含两个整数 $N$ ($1 \le N \le 15$) 和 $M$ ($1 \le M \le N$)。第二行通过 $N$ 个整数指定初始位串。每个整数 $b_i$ 为 0 或 1。第三行包含游程编码,由 $M$ 个整数组成。整数 $p_1$ 到 $p_M$ 表示位串中连续零或一序列的长度,从左到右排列。这里,$1 \le p_j$ 对于 $1 \le j \le M$ 成立,且 $\sum_{j=1}^{M} p_j = N$。保证初始位串可以重排为游程编码为 $p_1, \dots, p_M$ 的位串。
输出格式
输出所需的最小交换次数。
样例
样例输入 1
6 3 1 0 0 1 0 1 1 3 2
样例输出 1
1
样例输入 2
7 2 1 1 1 0 0 0 0 4 3
样例输出 2
12
样例输入 3
15 14 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2
样例输出 3
7
样例输入 4
1 1 0 1
样例输出 4
0