void getNext(string s, int *next)
{
int n = s.length(), i = 0, j = -1;
next[0] = -1;
while (i < n-1)
{
if (j == -1 || s[i] == s[j])
next[++i] = ++j;
else
j = next[j];
}
}
int kmp(string s, string t)
{
int n1 = s.length(), n2 = t.length(), i = 0, j = 0;
int *next = new int[n2];
getNext(t, next);
while (i<n1&&j<n2)
{
if (j == -1 || s[i] == t[j])
{
i++;
j++;
}
else
j = next[j];
}
return j == n2 ? i - j : -1;
}