KMP算法
作者:
且行且珍惜_9
,
2020-06-05 10:24:40
,
所有人可见
,
阅读 810
### 算法思想:
next[] 的含义:x[i-next[i]...i-1]=x[0...next[i]-1]
next[i] 为满足 x[i-z...i-1]=x[0...z-1] 的最大 z 值(就是 x 的自身匹配)
S下标: 1234567
S="abababc"
P的下标 12345678
P="abababab"
ne[1]=0,ne[2]=0, ne[3]=1,
ne[4]=2,ne[5]=3,ne[6]=4,
ne[7]=5,ne[8]=6;
ne[i]=j,表示的含义是p[1,...j]=p[i-j-1,i]即最大的前缀和等于后缀和。
### C++代码:
#include <iostream>
using namespace std;
const int N = 10010, M = 100010;
int n, m;
int ne[N];
char s[M], p[N];
int main()
{
cin >> n >> p + 1 >> m >> s + 1;
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];
}
}
return 0;
}
KMP是个好东西