[codeforces494B]Obsessive String

[codeforces494B]Obsessive String

试题描述

Hamed has recently found a string t and suddenly became quite fond of it. He spent several days trying to find all occurrences of t in other strings he had. Finally he became tired and started thinking about the following problem. Given a string s how many ways are there to extract k ≥ 1 non-overlapping substrings from it such that each of them contains string t as a substring? More formally, you need to calculate the number of ways to choose two sequences a1, a2, ..., ak and b1, b2, ..., bksatisfying the following requirements:

  • k ≥ 1
  •   t is a substring of string sa_isa_i + 1... sb_i (string s is considered as 1-indexed).

As the number of ways can be rather large print it modulo 109 + 7.

输入

Input consists of two lines containing strings s and t (1 ≤ |s|, |t| ≤ 105). Each string consists of lowercase Latin letters.

输出

Print the answer in a single line.

输入示例

welcometoroundtwohundredandeightytwo
d

输出示例

274201

数据规模及约定

见“输入

题解

首先用 KMP 预处理一波数组 pos[i],表示串 s 第 i 位左边最靠右的那次对于 t 的完整匹配的左端点(有点拗口,举个栗子 s = "ababa",那么 pos[i] = {0, 0, 1, 1, 3})。

有了 pos 数组,就可以 dp 了。我们考虑每个位置放置一个左端点,或是一个右端点,或者不放(注意不放有两种情况,一种是刚放完左端点,一种是刚放完右端点);于是设 f[i][0] 表示最后一次放的是左端点,放在了位置 i 或者 i 的左边;f[i][1] 表示最后一次放的是右端点,放在了位置 i 或 i 的左边。转移时就是考虑当前这个位置放置还是不放,具体转移方程留给读者思考。

 

posted @   xjr01  阅读(440)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示