Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

繰り返す呪文

古代国家イワシロを発見し調査を進めた我々研究者は、ついにイワシロの中心部にある神殿を発見した。神殿にはイワシロの神にささげた石版が保管されていた。石版には、文章と呪文が一つずつ、２つの文字列が書かれていた。

イワシロでは呪文が文章の中に、何回現れるかが重要な意味を持つ。ただし、呪文に含まれるすべての文字が順番に、文章の中にとびとびで現れるものも１回現れていると考える。例えば、文章が"abab" で、呪文が "ab" であれば、連続でないものも含めて "ab" は "abab" の中に３回現われている（ abab, abab, abab の３通り）。

文章と呪文が与えられたとき、呪文が文章の中に何回現れるかを出力するプログラムを作成せよ。

Input

入力は以下の形式で与えられる。

t
b

１行目に、石版に書かれた文章を表す文字列tが与えられる。２行目に、石版に書かれた呪文を表す文字列bが与えられる。どちらの文字列も英小文字だけから成る、長さが1以上1000以下の文字列である。

Output

呪文が文章の中に何回現れるかを１行に出力する。ただし、出力すべき値は非常に大きくなりうるので、代わりに 1,000,000,007 で割った余りを出力する。

Sample Input 1

abab
ab

Sample Output 1

3

Sample Input 2

aaaabaaaabaaaabaaaab
aaaaa

Sample Output 2

4368

Sample Input 3

data
structure

Sample Output 3

0

Solution in C# (judge verdict: Accepted)

using System;

public class Hello
{
    public const int MOD = 1000000007;
    public static void Main()
    {
        var t = Console.ReadLine().Trim();
        var b = Console.ReadLine().Trim();
        var ans = goDP(t, b);
        Console.WriteLine(ans);

    }
    static long goDP(string t, string b)
    {
        var tL = t.Length;
        var bL = b.Length;
        var dp = new long[bL + 1, tL + 1];
        for (int i = 1; i <= tL; i++)
            if (b[0] == t[i - 1]) dp[1, i] = dp[1, i - 1] + 1;
            else dp[1, i] = dp[1, i - 1];
        for (int i = 2; i <= bL; i++)
            for (int j = 1; j <= tL; j++)
            {
                if (b[i - 1] == t[j - 1]) dp[i, j] = dp[i, j - 1] + dp[i - 1, j - 1];
                else dp[i, j] = dp[i, j - 1];
                dp[i, j] %= MOD;
            }
        return dp[bL, tL];
    }
}