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

void KMP(char *text, char *pat) {
    int n = strlen(text);
    int m = strlen(pat);

    // build LPS array
    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

    int found = 0;

    while (i < n) {
        if (text[i] == pat[j]) {
            i++;
            j++;
        }

        if (j == m) {
            printf("Pattern found at index %d\n", i - j);
            found = 1;
            j = lps[j - 1];
        }
        else if (i < n && text[i] != pat[j]) {
            if (j != 0)
                j = lps[j - 1];
            else
                i++;
        }
    }

    if (!found) {
        printf("No match found\n");
    }
}

int main() {
    char text[] = "bcd egfpqr";
    char pat[]  = "efg";

    KMP(text, pat);

    return 0;
}