kmp
next[i]:求模式串中前缀和后缀的最长公共前缀
即对于[1,i]来说,求最大的x,使s[1,x]等于s[i-x+1,i]
例题
以hdu1711为例,
统计a串中第一个出现b串的起始下标,
即若第一个出现b串的区间是[l,r],输出l
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int a[1000005],b[10005];
int n,m;
int nex[10005];
void kmppre(){
int i=0,j=nex[0]=-1;
while(i<m){
while(j!=-1&&b[i]!=b[j])j=nex[j];
nex[++i]=++j;
}
}
int kmpcount(){
int i,j,ans=0;
kmppre();
i=j=0;
while(i<n){
while(j!=-1&&a[i]!=b[j])j=nex[j];
i++;j++;
if(j==m)return i-j+1;
}
return -1;
}
int main(){
int T;
scanf("%d",&T);
while(T--){
scanf("%d%d",&n,&m);
for(int i=0;i<n;++i)scanf("%d",&a[i]);
for(int i=0;i<m;++i)scanf("%d",&b[i]);
printf("%d\n",kmpcount());
}
return 0;
}
最小表示法与最大表示法
最小表示法:
对于串bca来说,其循环串abc,bca,cab中字典序最小的那个,串abc,即为最小表示
最大表示法同理
hdu3374,

本文深入讲解了KMP算法的核心概念及应用,包括模式匹配、最小表示法与最大表示法的求解方法,以及如何通过扩展KMP算法解决复杂问题。
最低0.47元/天 解锁文章
384

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



