KMP模版留念

来源:互联网 发布:淘宝店铺首页导航栏 编辑:程序博客网 时间:2024/06/05 14:22
void getnext(int s[],int next[],int len){    int i=0,j=-1;    next[0]=-1;    while(i<len)    {        if(j==-1 || s[i]==s[j])            i++,j++,next[i]=j;        else            j=next[j];    }}// 字符串a中从pos处开始寻找字符串b的位置int KMP(const int a[],const int b[],int pos,int next[],int la,int lb){    int i=pos,j=0;    next[0]=-1;    while(i<la && j<lb)    {        if(j==-1 || a[i]==b[j])            i++,j++;        else            j=next[j];    }    if(j>=lb)        return i-lb+1;    else        return -1;}int a[1000005],b[1000005],next[1000005];int main(){    int m,n,t,i,j;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&m,&n);        for(i=0;i<m;i++)            scanf("%d",&a[i]);        for(j=0;j<n;j++)            scanf("%d",&b[j]);        getnext(b,next,n);        printf("%d\n",KMP(a,b,0,next,m,n));    }}