#P14212. [ROI 2016 Day2] 二进制输入

[ROI 2016 Day2] 二进制输入

题目背景

译自 ROI 2016 Day2 T4. Тренажёр «10_2-пальцевый набор»

题目描述

现代的机器人程序员必须掌握盲打的 10210_2 指法,用以输入只由字符 01 组成的二进制字符串。在专为已经熟练掌握 10210_2 指法的机器人设计的创新训练器中,提出了如下练习。

屏幕上方显示一个由 0 和 1 组成的目标字符串。屏幕下方给出若干对 (ci,wi)(c_i, w_i),其中 wiw_i 是一个二进制单词,cic_i 是其代价——表示每次在输入目标字符串时使用该单词所需的罚分。

机器人需要将给定的目标字符串输入出来。它可以使用提供的二进制单词的前缀后缀,并将它们依次拼接起来。同一个单词可以被使用任意多次。但每次使用该单词的前缀或后缀时,都会获得等于该单词代价 cic_i 的罚分。

一个单词的前缀是从单词第一个字符开始的连续字符序列,一个单词的后缀是以单词最后一个字符结尾的连续字符序列。整个单词既是它的前缀,也是它的后缀。

请编写一个程序,计算在使用所给单词的前缀和后缀拼接出目标字符串时,机器人所能获得的最小总罚分。若无法构造出目标字符串,则输出 1-1

输入格式

输入的第一行包含三个整数 mmnnLL——分别表示目标字符串的长度、可使用的单词数量,以及这些单词长度的总和(1m3000001 \le m \le 300\,0001n3000001 \le n \le 300\,0001L3000001 \le L \le 300\,000)。

第二行包含目标字符串,由 mm 个字符组成,每个字符为 01

接下来的 nn 行中,每行描述一个可使用的二进制单词。首先给出该单词的罚分 cic_i1ci1091 \le c_i \le 10^9),然后是一个非空的二进制字符串 wiw_i(仅由 01 组成),二者以空格分隔。

每个单词的长度不超过 lmaxl_{\max},该值在不同子任务中有额外限制。

输出格式

输出一个整数——输入目标字符串所需的最小罚分总和;如果无法通过给定的单词前缀或后缀组合出目标字符串,则输出 1-1

9 2 8
000110100
1 100
1 11001
4
9 3 10
010110101
3 0101
10 011
2 100
8
3 1 3
100
1 101
-1

提示

样例解释

在第一个样例中,可以按以下方式获得目标字符串:

  1. 使用第一个单词的后缀(长度为 2);
  2. 再次使用第一个单词的后缀(长度为 1);
  3. 使用第二个单词的前缀(长度为 3);
  4. 最后使用第一个单词的完整形式。

总罚分为 4。

评分说明

下表列出了各子任务中对输入参数的附加限制。其中 lmaxl_{\text{max}} 表示提供给机器人的每个二进制单词的最大长度。

子任务编号 分值 mm nn LL cic_i lmaxl_{\text{max}} 必须通过的子任务
1 20 m50m \le 50 n50n \le 50 L500L \le 500 ci1000c_i \le 1000 lmax50l_{\text{max}} \le 50
2 10 m5000m \le 5000 L5000L \le 5000 lmax1000l_{\text{max}} \le 1000 1
3 8 m10000m \le 10\,000 L50000L \le 50\,000 1, 2
4 m50000m \le 50\,000 lmax2000l_{\text{max}} \le 2000 1–3
5 10 n20n \le 20
6 5 n200n \le 200 5
7 9 ci=1c_i = 1
8 5 ci10c_i \le 10 7
9 ci100c_i \le 100 7, 8
10 1–9
11 m100000m \le 100\,000 L100000L \le 100\,000 1–10
12 m200000m \le 200\,000 L200000L \le 200\,000 1–11
13 m300000m \le 300\,000 L300000L \le 300\,000 1–12

翻译由 ChatGPT-5 完成