#include <stdio.h>
#include <string.h>
void computeNext(char *pattern, int *next, int m) {
int j = 0;
next[0] = -1;
int k = -1;
while (j < m - 1) {
if (k == -1 || pattern[j] == pattern[k]) {
j++;
k++;
next[j] = k;
} else {
k = next[k];
}
}
}
void KMPSearch(char *text, char *pattern) {
int n = strlen(text);
int m = strlen(pattern);
int *next = (int *)malloc(m * sizeof(int));
computeNext(pattern, next, m);
int i = 0;
int j = 0;
while (i < n) {
if (j == -1 || text[i] == pattern[j]) {
i++;
j++;
}
if (j == m) {
printf("Pattern found at index: %d\n", i - j);
j = next[j - 1];
} else if (i < n && text[i] != pattern[j]) {
j = next[j];
}
}
free(next);
}
int main() {
char text[] = "ABABDABACDABABCABAB";
char pattern[] = "ABABCABAB";
KMPSearch(text, pattern);
return 0;
}