#366. 覆盖

传统 1000 ms 512 MiB
标准 IO
文本比较 admin 标签

题目描述

你有一个01串,你可以选择 mm 个长度为 kk 的区间进行覆盖,并且要求每一个这样的区间中出现了至少 pp 个 1 。

你选择的两个区间可以重叠。如果可供选择的区间不足 mm 个,那么这些区间都会被选择;如果可供选择的区间大于等于 mm 个,那么 一定 要选择 mm 个区间。

求在所有可能的选择情况中,哪些点一定被覆盖,哪些点不一定被覆盖。

输入格式

第一行一个正整数 TT 表示数据组数。

每组数据有两行:

第一行三个正整数 n,m,k,pn,m,k,p,其中 nn 为字符串长度,m,k,pm,k,p 意义如题目描述。

然后一行一个长度为 nn 的01串。

输出格式

每组数据输出一行一个长度为 nn 的字符串,仅由 ?,-,+ 组成,表示

  1. - 这个位置一定不被覆盖。
  2. + 这个位置一定被覆盖。
  3. ? 无法确定。

样例

样例输入

3
8 100 2 1
00011000
8 2 3 2
10100110
12 3 4 3
011101011000

样例输出

--++++--
???-?++?
?+++++???---

样例解释

对于第一个样例,包含 1 的数量大于等于 p=1 的长度为 k=2 区间有 [3,4],[4,5],[5,6] ,共 3 个,远不足 m=100 个。
所以这 3 个区间都会被选择,从而覆盖了 [3,6] 内所有的点,其余点都不会被覆盖。

数据范围与提示

T100,1n1000,m,k,pnT\leq 100,1\leq n\leq 1000,m,k,p\leq n

赛后补充:@josh00 注意到,样例中第一条数据不满足 mnm\leq n,这是一个错误;但测试数据中不存在这样的数据。