#include <stdlib.h>
#include <string.h>
int kmp(char substr[], char str[])
{
int i, j, N, M;
int *d
= (int*)malloc(M
* sizeof(int)); d[0] = 0;
for(i = 0, j = 0; i < M; i++)
{
while(j > 0 && substr[j] != substr[i])
{
d[j] = i - 1;
}
if(substr[j] == substr[i])
{
j++;
d[i] = j;
}
}
for(i = 0, j = 0; i < N; i++)
{
while(j > 0 && substr[j] != str[i])
{
d[j] = i - 1;
}
if(substr[j] == str[i])
{
j++;
}
if(j == M)
{
return i- j + 1;
}
}
return -1;
}
int main(void)
{
char substr[] = "World",
str[] = "Hello World!\r\n";
int pos = kmp(substr, str);
return 0;
}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgppbnQga21wKGNoYXIgc3Vic3RyW10sIGNoYXIgc3RyW10pCnsKICAgIGludCBpLCBqLCBOLCBNOwoKICAgIE4gPSBzdHJsZW4oc3RyKTsKICAgIE0gPSBzdHJsZW4oc3Vic3RyKTsKCiAgICBpbnQgKmQgPSAoaW50KiltYWxsb2MoTSAqIHNpemVvZihpbnQpKTsKICAgIGRbMF0gPSAwOwoKICAgIGZvcihpID0gMCwgaiA9IDA7IGkgPCBNOyBpKyspCiAgICB7CiAgICAgICAgd2hpbGUoaiA+IDAgJiYgc3Vic3RyW2pdICE9IHN1YnN0cltpXSkKICAgICAgICB7CiAgICAgICAgICAgIGRbal0gPSBpIC0gMTsKICAgICAgICB9CgogICAgICAgIGlmKHN1YnN0cltqXSA9PSBzdWJzdHJbaV0pCiAgICAgICAgewogICAgICAgICAgICBqKys7CiAgICAgICAgICAgIGRbaV0gPSBqOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IoaSA9IDAsIGogPSAwOyBpIDwgTjsgaSsrKQogICAgewogICAgICAgIHdoaWxlKGogPiAwICYmIHN1YnN0cltqXSAhPSBzdHJbaV0pCiAgICAgICAgewogICAgICAgICAgICBkW2pdID0gaSAtIDE7CiAgICAgICAgfQoKICAgICAgICBpZihzdWJzdHJbal0gPT0gc3RyW2ldKQogICAgICAgIHsKICAgICAgICAgICAgaisrOwogICAgICAgIH0KCiAgICAgICAgaWYoaiA9PSBNKQogICAgICAgIHsKICAgICAgICAgICAgZnJlZShkKTsKICAgICAgICAgICAgcmV0dXJuIGktIGogKyAxOwogICAgICAgIH0KICAgIH0KCiAgICBmcmVlKGQpOwoKICAgIHJldHVybiAtMTsKfQoKaW50IG1haW4odm9pZCkKewogICAgY2hhciBzdWJzdHJbXSA9ICJXb3JsZCIsCiAgICAgICAgc3RyW10gPSAiSGVsbG8gV29ybGQhXHJcbiI7CgogICAgaW50IHBvcyA9IGttcChzdWJzdHIsIHN0cik7CgogICAgcmV0dXJuIDA7Cn0=