public class KMP {
private int[][] dp;
private String pat;
public KMP (String pat) {
this.pat = pat;
int M = pat.length();
dp = new int[M][256];
dp[0][pat.charAt(0)] = 1;
int X = 0;
for (int j = 1; j < M; j++) {
for (int c = 0; c < 256; c++) {
if (pat.charAt(j) == c) {
dp[j][c] = j+1;
} else {
dp[j][c] = dp[X][c];
}
}
X = dp[X][pat.charAt(j)];
}
}
public int search(String txt) {
int M = pat.length();
int N = txt.length();
int j = 0;
for (int i = 0; i < N; i++) {
j = dp[j][txt.charAt(i)];
if (j == M) return i - M + 1;
}
return -1;
}
}
void get_next() {
next[0] = -1;
int i = 0, j = -1;
int len = strlen(pat);
while(i < len) {
if(j == -1 || pat[i] == pat[j])
next[++i] = ++j;
else j = next[j];
}
}
bool KMP() {
get_next();
int len1 = strlen(pat);
int len2 = strlen(s);
int i = 0, j = 0;
while(j < len2) {
if(pat[i] == s[j]) {
i++;
j++;
if(i == len1) return true;
} else {
i = next[i];
if(i == -1) {
j++;
i++;
}
}
}
return false;
}