
#include <stdio.h>
#include <string.h>

int KMP(char *text, char *pat) {
    int n = strlen(text);
    int m = strlen(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");
}