字符串生成(期望DP)

题目描述

你初始有一个空串,接下来每秒,你会随机等概率产生一个 0 0 0 1 1 1加在你当前的字符串结尾。你会停下来当且仅当 S S S是你手上的字符串的子串。

请问期望多少秒后你才会停下来,答案对 1 0 9 + 7 10^9+7 109+7取模。

输入格式

一行一个01字符串 S S S

输出格式

一行一个整数表示期望长度对 1 0 9 + 7 10^9+7 109+7取模的值。

样例输入
0001
样例输出
16
数据范围

∣ S ∣ ≤ 1 0 6 |S|\leq 10^6 S106

题解

我们设 f i f_i fi表示已经匹配了前 i i i个后匹配完整个串的期望步数。用KMP处理出 n x t nxt nxt数组后,可以得出转移式:

f i = 1 + 1 2 ( f i + 1 + f n x t i + 1 ) f_i=1+\dfrac{1}{2}(f_{i+1}+f_{nxt_i+1}) fi=1+21(fi+1+fnxti+1)

显然 f n = 0 f_n=0 fn=0

因为字符串是从 0 0 0开始的,所以匹配前 i i i个实际上是匹配完了 s i − 1 s_{i-1} si1所以这里是 n x t i nxt_i nxti。又因为 f i + 1 f_{i+1} fi

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值