题目描述
你初始有一个空串,接下来每秒,你会随机等概率产生一个 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 ∣S∣≤106
题解
我们设 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} si−1所以这里是 n x t i nxt_i nxti。又因为 f i + 1 f_{i+1} fi