public int[] getNext(char[] s, int len){
int[] next=new int[len];
int j=-1;
next[0]=-1;
for(int i=1;i<len;i++){
while(j>=0&&s[i]!=s[j+1]){
j=next[j];
}
if(s[i]==s[j+1]){
j++;
}
next[i]=j;
}
return next;
}
public boolean KMP(char[] text, char[] pattern){
int n=text.length;
int m=pattern.length;
getNext(pattern, m);
int j=-1;
for(int i=0;i<n;i++){
while(j!=-1&&text[i]!=pattern[j+1]){
j=next[j];
}
if(text[i]==pattern[j+1]){
j++;
}
if(j==m-1){
return true;
}
}
return false;
}
public boolean KMP(char[] text, char[] pattern){
int n=text.length;
int m=pattern.length;
getNext(pattern, m);
int j=-1;
int ans=0;
for(int i=0;i<n;i++){
while(j!=-1&&text[i]!=pattern[j+1]){
j=next[j];
}
if(text[i]==pattern[j+1]){
j++;
}
if(j==m-1){
ans++;
j=next[j];
}
}
return ans;
}