#P12810. [AMPPZ 2019] Henry Porter and the Palindromic Radius

[AMPPZ 2019] Henry Porter and the Palindromic Radius

题目背景

Source: AMPPZ 2019.

题目描述

年轻的巫师 Henry Porter 刚刚收到一个悲伤的消息——他家族中最年长的长辈,Markus Radius Palindromus Black 叔叔去世了。Black 叔叔以性格古怪著称,擅长复杂的二进制魔法,同时也以极其富有闻名。

Black 的遗嘱声明,Henry 将继承他神秘的宝藏密室。然而,要进入并认领宝藏,这位年轻巫师必须说出正确的密码 HH——这是一个长度为 nn、由字符 0 和 1 组成的单词。Black 叔叔并未直接告诉 Henry 密码(这显然不符合他的风格),而是为每个位置 x=1,2,,nx = 1, 2, \ldots, n 计算了回文半径 pxp_x——最大的整数,使得以 H[x]H[x] 为中心、长度为 2px+12p_x + 1 的子串 H[xpxx+px]H[x - p_x \ldots x + p_x] 存在且为回文。Henry 只收到了这些值 p1,,pnp_1, \ldots, p_n。例如,如果密码是 10111010,Henry 会得到序列 (0,1,0,3,0,1,1,0)(0, 1, 0, 3, 0, 1, 1, 0)

Henry 希望 Black 叔叔别在死后还要考验他的算法能力,但抱怨也无济于事。好在他有能帮忙的朋友!根据遗嘱中留下的序列,确定所有可能的对应密码。由于遗嘱破损且污迹斑斑,甚至可能根本无解。

输入格式

本题单个测试点内有多组测试数据。
输入的第一行包含测试数据数量 zz1z2000001 \le z \le 200\,000)。每组测试数据的格式如下:

每组测试数据包含两行。第一行包含一个整数 nn——密码和 Black 序列的长度(2n10000002 \le n \le 1\,000\,000)。第二行包含 nn 个整数 p1,p2,,pnp_1, p_2, \ldots, p_n0pi<n0 \le p_i < n)——密码中每个字符对应的回文半径。
所有测试数据的 nn 值总和不超过 51075 \cdot 10^7

输出格式

对于每组测试数据,首先输出可能密码的数量 kk
如果 k>0k > 0,则在接下来的 kk 行中按字典序输出所有可能的 {0,1}\{0, 1\} 序列形式的解。

可以假设 kk 不超过 100。

1
8
0 1 0 3 0 1 1 0
4
00010000
01000101
10111010
11101111