晕, 每次写KMP都有写错的概率,这次存下来好好看看
void cnext()
{
memset(next, 0, sizeof(next));
next[0] = -1;
int i = 0, k = -1;
while(s[i])
{
if(k == -1 || s[i] == s[k])
{
next[++i] = ++k;
}
else
{
k = next[k];
}
}
}
int kmp()
{
int slen = strlen(s), strLen = strlen(str);
int i = 0, k = 0;
while(i < strLen && k < slen)
{
if(k == -1 || str[i] == s[k])
{
i++, k++;
}
else
{
k = next[k];
}
}
return i - slen;
}