using System;
unsafe class Program
{
static int kmp(char[] substr, char[] str)
{
int i, j, N, M;
N = str.Length;
M = substr.Length;
int*[] d = new int*[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)
{
d = null;
GC.Collect();
return i - j + 1;
}
}
d = null;
GC.Collect();
return -1;
}
static void Main()
{
char[] substr = "World".ToCharArray(),
str = "Hello World!\r\n".ToCharArray();
int pos = kmp(substr, str);
}
}
dXNpbmcgU3lzdGVtOwoKdW5zYWZlIGNsYXNzIFByb2dyYW0KewogICAgc3RhdGljIGludCBrbXAoY2hhcltdIHN1YnN0ciwgY2hhcltdIHN0cikKICAgIHsKICAgICAgICBpbnQgaSwgaiwgTiwgTTsKCiAgICAgICAgTiA9IHN0ci5MZW5ndGg7CiAgICAgICAgTSA9IHN1YnN0ci5MZW5ndGg7CgogICAgICAgIGludCpbXSBkID0gbmV3IGludCpbTSAqIHNpemVvZihpbnQpXTsKICAgICAgICAqZFswXSA9IDA7CgogICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgTTsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgd2hpbGUgKGogPiAwICYmIHN1YnN0cltqXSAhPSBzdWJzdHJbaV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICpkW2pdID0gaSAtIDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzdWJzdHJbal0gPT0gc3Vic3RyW2ldKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgICAgICAqZFtpXSA9IGo7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgTjsgaSsrKQogICAgICAgIHsKICAgICAgICAgICAgd2hpbGUgKGogPiAwICYmIHN1YnN0cltqXSAhPSBzdHJbaV0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICpkW2pdID0gaSAtIDE7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChzdWJzdHJbal0gPT0gc3RyW2ldKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBqKys7CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChqID09IE0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGQgPSBudWxsOwogICAgICAgICAgICAgICAgR0MuQ29sbGVjdCgpOwogICAgICAgICAgICAgICAgcmV0dXJuIGkgLSBqICsgMTsKICAgICAgICAgICAgfQogICAgICAgIH0KCiAgICAgICAgZCA9IG51bGw7CiAgICAgICAgR0MuQ29sbGVjdCgpOwoKICAgICAgICByZXR1cm4gLTE7CiAgICB9CgogICAgc3RhdGljIHZvaWQgTWFpbigpCiAgICB7CiAgICAgICAgY2hhcltdIHN1YnN0ciA9ICJXb3JsZCIuVG9DaGFyQXJyYXkoKSwKICAgICAgICAgICAgc3RyID0gIkhlbGxvIFdvcmxkIVxyXG4iLlRvQ2hhckFycmF5KCk7CgogICAgICAgIGludCBwb3MgPSBrbXAoc3Vic3RyLCBzdHIpOwogICAgfQp9