D. 扩展九连环

内存限制:256 MiB 时间限制:1000 ms 标准输入输出
题目类型:传统 评测方式:文本比较

题目描述

提示:本题中的九连环不允许 1,2 环同时上或下,与传统九连环不同。

九连环是一种源于中国的传统智力游戏。如图所示,九个的圆环套在一把“剑”上,并且互相牵连。

在传统的九连环中,第 k(k\ge 2) 个环可以装上“剑”(记为 1 )或拆下“剑”(记为 0 ),当且仅当第 k-1 个环在剑上,且再之前的环不在剑上;特别地,第 1 个环可以任意上下。

本题中我们将会讨论更一般的情形,虽然这种扩展九连环不一定可以在物理意义上造出。

题目描述

一个扩展九连环,可以看作两个 01 串——规则串 s 和状态串 t ,满足 |s|=|t|-1 。其中 t_i = \texttt 1 表示第 i 个环是装上的, t_i = \texttt 0 表示第 i 个环是拆下的。

s 在同一局游戏中是不变的,而 t 每步会变化一个位置上的值(从 0 变成 1 或从 1 变成 0)。九连环被拆下,当且仅当 t_i 全是 0;九连环被装上,当且仅当 t_i 全是 1

扩展九连环规定, t_i 可以变化,当且仅当 t_{1\sim i-1} s 的一个后缀。可以看出,传统的九连环就是 s 00...01 的特殊情形。

给出一个 s ,问从拆下状态到装上状态至少需要几步,答案对 10^9+7 取模。

输入格式

输入格式

第一行一个整数 n ,表示 s 的长度。注意不是环的数量。

第二行一个 01 s

输出格式

输出格式

一行一个整数,表示答案对 10^9+7 取模后的值。

样例

样例 #1

样例输入 #1

3
011

样例输出 #1

6

样例 #2

样例输入 #2

8
00000001

样例输出 #2

341

数据范围与提示

对于 100\% 的数据, 1\le n\le 2000 s_i\in\{\texttt 0,\texttt 1\}

测试点编号 \vert s\vert\le 特殊性质
1\sim 3 3
4\sim 6 15
7\sim 11 300
12\sim 13 1000
14 2000 s_i 全为 0
15\sim 17 s 末尾为 1,其余位置为 0
18\sim 25

样例 1 解释

初始时刻所有环都不在剑上,状态串 t 0000

第 1 步装上第 1 个环, t 变成 1000

第 2 步装上第 2 个环, t 变成 1100

第 3 步装上第 3 个环, t 变成 1110

接下来你不能直接装上第 4 个环,因为 111 并不是规则串 s 011 的后缀。因此第 4 步应拆下第 1 个环, t 变成 0110

然后第 5 步装上第 4 个环, t 变成 0111

最后一步装上第 1 个环, t 变成 1111,完成目标。

样例 2 解释

这就是传统的九连环,且恰好有 9 个环。