KMP
next数组的实现以及思想都非常的精彩,值得经常回顾思索。
数组的下标均为从1开始,不仅是为了简洁,s数组可以从0开始但并不简洁,p数组从0开始则缺少p[-1]来存放一些必要的值,会有严重的问题。
int n, m;
int ne[N];
char s[M], p[N];
for (int i = 2, j = 0; i <= n; i ++ )
{
while (j && p[i] != p[j + 1]) j = ne[j];
if (p[i] == p[j + 1]) j ++ ;
ne[i] = j;
}
for (int i = 1, j = 0; i <= m; i ++ )
{
while (j && s[i] != p[j + 1]) j = ne[j];
if (s[i] == p[j + 1]) j ++ ;
if (j == n)
{
printf("%d ", i - n);
j = ne[j];
}
}