import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     * 计算模板串S在文本串T中出现了多少次
     * @param S string字符串 模板串
     * @param T string字符串 文本串
     * @return int整型
     */
    public int kmp (String S, String T) {
        int i=0;
		int s=0;
        /*while((i=T.indexOf(S, i))!=-1) {
        	s++;
        	i++;
        }*/
		int[] arr = getnext(S);
		for(int j=i;i<T.length();i++,j++) {
			if(T.charAt(i)!=S.charAt(j)) {
				j=arr[j];
				if(j==-1) {
					continue;
				}
				//再来比一次
				i--;
				j--;
			}
			if(j==S.length()-1) {//匹配到了
				s++;
				j=arr[j]; // -------虽然匹配上了,但当做没匹配上,可以找到重叠的部分
			}
		}
		
		
        return s;
    }
    public static int[] getnext(String s) {
		int[] result = new int[s.length()];
		char ii, jj;
		/*
        双层循环生成数组,下面优化成动态规划单层循环生成
        for(int i =1;i<s.length();i++) { 
			ii = s.charAt(i);
			for(int j=i+1;j<s.length();j++) {
				jj=s.charAt(j);
				if(result[j-1]==i-1) {
					if(jj==ii) {
						result[j]=i;
					}
				}
			}
		}
		result[0]=-1;*/
		Arrays.fill(result, -1);
		for(int i=1;i<s.length();i++) {
			if(s.charAt(result[i-1]+1)==s.charAt(i)) {
				result[i]=result[i-1]+1;
			}else{
				result[i]=0;
			}
		}
		
		return result;
		
	}
}