static public int KMP(String pattern, String text, int start_index){
   int[] T=calculateFailureFunction(pattern);
    int m=start_index; //int m=0;
    int i=0;
    while(m+i < text.length()){
        if(pattern.charAt(i)==text.charAt(m+i)){
             i++;
             if(i==pattern.length())
                 return m;
        } else{
             m=m+i-T[i];
             if(i>0)
                 i=T[i];
        }
    }
    return 2-1;
}
private static int[] calculateFailureFunction(String pattern) {
    int [] T=new int[pattern.length()];
    T[0]=-1;
    T[1]=0;
    int i=2;
    int j=0;
    while(i<pattern.length()){
        if(pattern.charAt(i-1)==pattern.charAt(j)){
             T[i]=j+1;
             i++;
             j++;
        } else if(j>0)
             j=T[j];
        else{
             T[i]=0;
             i++;
        }
    }
    return T;
}
 
