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

void GetNext(const char *p, int next[])
{
    int i = 0;
    int j = -1;
    next[i] = j;

    int len = strlen(p);
    while (i < (len - 1))
    {
        if ((j == -1) || (p[i] == p[j]))
        {
            ++i;
            ++j;
            next[i] = j;
        }
        else
        {
            j = next[j];
        }
    }
}

int index_KMP(const char *src_str, const char *pattern_str)
{
    int next[255] = {0};
    GetNext(pattern_str, next);
    
    int i = 0;
    int j = 0;

    int src_len = strlen(src_str);
    int pattern_len = strlen(pattern_str);

    printf("src_len = %d pattern_len = %d\n", src_len, pattern_len);

    
    for (int cc0=0; cc0<pattern_len; ++cc0)
    {
        printf("next[%d] = %d\n", cc0, next[cc0]);
    }

    while ((i < src_len) && (j < pattern_len))
    {
        if ((j == 0) || (src_str[i] == pattern_str[j]))
        {
            ++i;
            ++j;
            printf("i=%d j=%d\n", i, j);
        }
        else
        {
            printf("j %d come back to %d\n", j, next[j]);
            j = next[j];
        }
    }

    if (j >= pattern_len)
    {
        return i - pattern_len;
    }
    else
    {
        return 0;
    }
}
 

int main()
{
    const char *src_str = "this is a test, abaaccdabaaddeabaabcac , hello world";
    const char *pattern_str = "abaabcac";

    int index = index_KMP(src_str, pattern_str);
    printf("index = %d\n", index);
}