#include <stdio.h>
#include <string.h>
int KMP(char *text, char *pat) {
// build LPS inside KMP
int lps[m];
int len = 0;
lps[0] = 0;
int i = 1;
while (i < m) {
if (pat[i] == pat[len]) {
len++;
lps[i] = len;
i++;
} else {
if (len != 0) {
len = lps[len - 1];
} else {
lps[i] = 0;
i++;
}
}
}
// search phase
i = 0; // text index
int j = 0; // pattern index
while (i < n) {
if (text[i] == pat[j]) {
i++;
j++;
}
if (j == m) {
return 1; // found
}
else if (i < n && text[i] != pat[j]) {
if (j != 0)
j = lps[j - 1];
else
i++;
}
}
return 0;
}
int main ()
{
KMP( "efg", "abcd egfpqr");
}
CiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgppbnQgS01QKGNoYXIgKnRleHQsIGNoYXIgKnBhdCkgewogICAgaW50IG4gPSBzdHJsZW4odGV4dCk7CiAgICBpbnQgbSA9IHN0cmxlbihwYXQpOwoKICAgIC8vIGJ1aWxkIExQUyBpbnNpZGUgS01QCiAgICBpbnQgbHBzW21dOwoKICAgIGludCBsZW4gPSAwOwogICAgbHBzWzBdID0gMDsKCiAgICBpbnQgaSA9IDE7CiAgICB3aGlsZSAoaSA8IG0pIHsKICAgICAgICBpZiAocGF0W2ldID09IHBhdFtsZW5dKSB7CiAgICAgICAgICAgIGxlbisrOwogICAgICAgICAgICBscHNbaV0gPSBsZW47CiAgICAgICAgICAgIGkrKzsKICAgICAgICB9IGVsc2UgewogICAgICAgICAgICBpZiAobGVuICE9IDApIHsKICAgICAgICAgICAgICAgIGxlbiA9IGxwc1tsZW4gLSAxXTsKICAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgICAgIGxwc1tpXSA9IDA7CiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9CgogICAgLy8gc2VhcmNoIHBoYXNlCiAgICBpID0gMDsgLy8gdGV4dCBpbmRleAogICAgaW50IGogPSAwOyAvLyBwYXR0ZXJuIGluZGV4CgogICAgd2hpbGUgKGkgPCBuKSB7CiAgICAgICAgaWYgKHRleHRbaV0gPT0gcGF0W2pdKSB7CiAgICAgICAgICAgIGkrKzsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KCiAgICAgICAgaWYgKGogPT0gbSkgewogICAgICAgICAgICByZXR1cm4gMTsgLy8gZm91bmQKICAgICAgICB9CiAgICAgICAgZWxzZSBpZiAoaSA8IG4gJiYgdGV4dFtpXSAhPSBwYXRbal0pIHsKICAgICAgICAgICAgaWYgKGogIT0gMCkKICAgICAgICAgICAgICAgIGogPSBscHNbaiAtIDFdOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBpKys7CiAgICAgICAgfQogICAgfQoKICAgIHJldHVybiAwOwp9CgppbnQgbWFpbiAoKQp7IAogICAgS01QKCAiZWZnIiwgImFiY2QgZWdmcHFyIik7Cn0=