kmp最基本功能,在主串找到子串位置并返回,找不到返回-1
#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdio>
#include <algorithm>
#include <iostream>
#include <queue>
#include <set>
#include <vector>
#define inf 0x7fffffff
#define lson l , m , rt << 1
#define rson m + 1 , r , rt << 1 | 1
const int maxn = 1000005;
using namespace std;
int nextval[maxn];
void get_next(int *t,int len) //失配函数
{
int i,j;
i=1;
nextval[1]=0;
j=0;
while(i<len)
{
if (j==0||t[i]==t[j])
{
j++;
i++;
if (t[i]!=t[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
int kmp(int* s,int* t,int len_s,int len_t)
{
int i=1;
int j=1;
while(i<=len_s&&j<=len_t)
{
if (j==0||s[i]==t[j])
{
i++;j++;
}
else
j=nextval[j];
}
if (j>len_t)
return i-len_t;
else
return 0;
}
int tm[1000005];
int nm[10005];
int main( )
{
int n;
int cnt=1;
int t;
scanf("%d",&t);
while(t--)
{
int i,n,m;
scanf("%d%d",&n,&m);
for (i=1;i<=n;i++)
{
scanf("%d",&tm[i]);
}
for (i=1;i<=m;i++)
{
scanf("%d",&nm[i]);
}
get_next(nm,m);
int ans=kmp(tm,nm,n,m);
printf("%d\n",ans>0?ans:-1);
}
return 0;
}
本文详细介绍KMP算法的核心功能及其实现过程,通过示例代码解释如何在主串中查找子串的位置,并返回相应的索引。文章包含失配函数(nextval)的计算方法以及KMP匹配算法的具体步骤。
545

被折叠的 条评论
为什么被折叠?



