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 JAVA (judge verdict: Runtime Error)

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Random;
import java.util.Scanner;

public class Main {
    public static long cl;
    public static char[] text;
    public static char[] rr;
    public static long[][] map;
    public static void main(String[] args){
        Scanner sc = new Scanner(System.in);
        text = sc.next().toCharArray();
        rr = sc.next().toCharArray();
        map = new long[rr.length][text.length];
        search(0,0);
        System.out.println(search(0,0));
    }

    public static long search(int p1,int p2){
        if(map[p1][p2] > 0){
            return map[p1][p2];
        }
        else if(map[p1][p2] == -1)return 0;
        char ss1 = rr[p1];
        if(p1 == rr.length - 1){
            long t = 0;
            for (int i = p2;i < text.length;++i){
                char ss2 = text[i];
                if(ss2 == ss1){
                    ++t;
                }
            }
            return t;
        }
        else {
            long t = 0;
            for (int i = p2;i < text.length;++i){
                char ss2 = text[i];
                if(ss2 == ss1){
                   t += search(p1 + 1, i + 1);
                }
            }
            if(t == 0){
                map[p1][p2] = -1;
            }
            else map[p1][p2] = t;
            return t;
        }
    }


}