
#define SIZE 100
void calc_lcp(int* d, const char* p)
{
int i = 1, j = 0, np = strlen(p);
memset(d, 0, sizeof(int) * np);
while (i < np)
{
if (p[i] == p[j])
{
d[i++] = ++j;
}
else
{
if (j > 0) j = d[j - 1];
else i++;
}
}
}
void kmp(const char* t, const char* p)
{
int d[SIZE];
int i = 0, j = 0, nt = strlen(t), np = strlen(p);
calc_lcp(d, p);
while (i < nt)
{
if (t[i] == p[j])
{
i++, j++;
if (j == np)
{
printf("%d\n", i - np);
return;
}
}
else
{
if (j > 0) j = d[j - 1];
else i++;
}
}
printf("%d\n", -1);
return ;
}
int main(void)
{
kmp("ABABABABC", "ABAB");
kmp("ABABCABAB", "ABAB");
kmp("AAAAAAA", "AAA");
kmp("ABABABC", "ABABC");
kmp("XYXZdeOXZZKWXYZ", "WXYZ");
kmp("GCAATGCCTATGTGACCTATGTG", "TATGTG");
kmp("AGATACGATATATAC", "ATATA");
kmp("CATCGCGGAGAGTATAGCAGAGAG", "GCAGAGAG");
return 0;
}