KMP
KMP模板
网上模板
next数组代表这一位匹配到下一位的位置
void get_nxt
{
nxt[0]=-1;
int i=0,j=-1;
while(i<len)
{
if(j==1||a[i]==a[j])
{
i++,j++;
nxt[i]=j;
}
else j=nxt[i];
}
}
void KMP
{
int i=0,j=0;
while(l<len1&&j<len2)
{
if (j == -1 || t[i] == p[j])
{
i++;
j++;
}
else j = Next[j];
if (j == len2)
{cout<<i-j<<' ';
j=Next[j];
}
}
}
}
yxc模板
nxt[i] 代表能返回的位置
#include <iostream>
using namespace std;
const int N = 100010, M = 1000010;
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;
}

浙公网安备 33010602011771号