#44013. 回文问题
回文问题
暂无测试数据。
小 Z 是一个很蒻的 oi 选手,他很喜欢回文串。于是有一天他出了一道回文串水题:
给定一个长度为 $n$ 的,每个字符为0
或1
的字符串 $s$,对于每一个 $1\le i\le n$,请你求出位置 $i$ 的回文半径 $r_i$。回文半径 $r_i$ 是指,最大的非负整数,满足 $i+r_i\le n,i-r_i \ge 1$,且 $s$ 中第 $i-r_i$ 个字符到第 $i+r_i$ 个字符构成的子串是一个回文串。即 $r_i = \max \{l \mid \forall 0\le k \le l,s_{i+k}=s_{i-k}\}$。
然而小 Z 在造数据时,不小心把所有输入文件弄丢了。为了不重造数据,小 Z 希望,你能实现一个程序帮助他根据程序的输出文件,构造一个正确的输入文件。也就是说,小 Z 会给你回文半径数组 $r$,你需要找到一个字符串 $s$,使得 $s$ 第 $i$ 个位置的回文半径恰好是 $r_i$。由于造数据时可能出现失误,这样的 $s$ 可能不存在。如果出现这种情况,请输出 -1
。
提示:读入量较大,请采用较快的输入输出方式。
注意内存限制,以免因为超出空间限制而失分。
输入格式
第一行一个正整数 $T$ 表示数据组数。
每组数据第一行一个正整数 $n$ 表示字符串 $s$ 的长度。第二行 $n$ 个非负整数,第 $i$ 个数表示 $r_i$。
输出格式
对于每组数据,如果存在满足条件的 $s$,输出一个字符串表示答案(字符之间不要加空格); 如果不存在,请输出 -1
。
如果存在多个满足条件的 $s$,你只需要输出其中任意一个即可。
数据范围
对于 $20\%$ 的数据,$T\le 6,n \le 21$。
对于 $40\%$ 的数据,$\sum n \le 1000$。
对于 $60\%$ 的数据,$\sum n \le 10^5$。
对于 $100\%$ 的数据,$1 \le \sum n \le 4\times 10^6, 1 \le r_i\le 10^9$。
5
1
0
2
3 1
2
0 0
10
0 0 2 0 0 2 0 1 1 0
5
0 3 0 0 2
0
-1
00
0010010000
-1